diff --git a/AUTHORS b/AUTHORS
new file mode 100644
index 0000000..8507c01
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,10 @@
+# This is the official list of tools_android authors for copyright purposes.
+# This file is distinct from the CONTRIBUTORS files.
+# See the latter for an explanation.
+
+# Names should be added to this file as:
+# Name or Organization <email address>
+# The email address is not required for organizations.
+
+Google Inc.
+The Android Open Source Project
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..2b9615d
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,21 @@
+# Contributing to tools_android
+
+## Contributor License Agreement
+
+Contributions to this project must be accompanied by a Contributor License
+Agreement. You (or your employer) retain the copyright to your contribution,
+this simply gives us permission to use and redistribute your contributions as
+part of the project. Head over to <https://cla.developers.google.com/> to see
+your current agreements on file or to sign a new one.
+
+You generally only need to submit a CLA once, so if you've already submitted one
+(even if it was for a different project), you probably don't need to do it
+again.
+
+## Patch Acceptance Process
+
+Read how to [contribute to Bazel](https://bazel.build/contributing.html)
+
+## Setting up your development environment
+
+Read how to [set up your development environment](https://bazel.build/contributing.html)
diff --git a/CONTRIBUTORS b/CONTRIBUTORS
new file mode 100644
index 0000000..b294e50
--- /dev/null
+++ b/CONTRIBUTORS
@@ -0,0 +1,10 @@
+# People who have agreed to one of the CLAs and can contribute patches.
+# The AUTHORS file lists the copyright holders; this file
+# lists people.  For example, Google employees are listed here
+# but not in AUTHORS, because Google holds the copyright.
+#
+# https://developers.google.com/open-source/cla/individual
+# https://developers.google.com/open-source/cla/corporate
+#
+# Names should be added to this file as:
+#     Name <email address>
diff --git a/LICENSE.txt b/LICENSE.txt
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/LICENSE.txt
@@ -0,0 +1,202 @@
+
+                                 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
+
+   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 "[]"
+      replaced with your own identifying information. (Don'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 "printed page" 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 "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/READEME.md b/READEME.md
new file mode 100644
index 0000000..ef8758d
--- /dev/null
+++ b/READEME.md
@@ -0,0 +1,3 @@
+# tools_android
+
+This repository hosts tools for use with building Android apps with Bazel.
diff --git a/tools/googleservices/BUILD b/tools/googleservices/BUILD
new file mode 100644
index 0000000..8345f3e
--- /dev/null
+++ b/tools/googleservices/BUILD
@@ -0,0 +1,6 @@
+java_binary(
+  name = "GenerateFirebaseXml",
+  srcs = ["java/com/google/gms/googleservices/GenerateFirebaseXml.java"],
+  deps = ["@com_google_code_gson_2_8_2//jar"],
+  visibility = ["//visibility:public"],
+)
diff --git a/tools/googleservices/defs.bzl b/tools/googleservices/defs.bzl
new file mode 100644
index 0000000..3c7adce
--- /dev/null
+++ b/tools/googleservices/defs.bzl
@@ -0,0 +1,39 @@
+"""Macros to support Google services, e.g. Firebase Cloud Messaging."""
+
+def google_services_xml(package_name, google_services_json):
+  """Creates Android resource XML for Google services.
+
+  The XML is based on a google-services.json file.
+
+  Args:
+    package_name: The package name (or application ID) of the Android app.
+    google_services_json: The google-services.json file.
+
+  Returns:
+    A list of the generated resource files which can be used with
+    android_binary.resource_files or android_library.resource_files.
+  """
+  # Adding the package name and google-services.json file to the outs and name
+  # of the rule is necessary in case there are multiple calls to
+  # google_services_xml() with different package names or different json files.
+  outs = ["google_services_xml/%s/%s/res/values/values.xml" %
+      (package_name, google_services_json.replace("/", "_"))]
+  name = "gen_google_services_xml_%s_%s" % (
+      package_name.replace(".", "_"),
+      google_services_json.replace(".", "_").replace("/", "_"))
+  if not native.existing_rule(name):
+    native.genrule(
+      name = name,
+      srcs = [google_services_json],
+      outs = outs,
+      tools = ["@rules_android//tools/googleservices:GenerateFirebaseXml"],
+      cmd = "$(location @rules_android//tools/googleservices:GenerateFirebaseXml) %s $< $@" % package_name,
+    )
+  return outs
+
+
+def google_services_workspace_dependencies():
+  native.maven_jar(
+    name = "com_google_code_gson_2_8_2",
+    artifact = "com.google.code.gson:gson:2.8.2",
+  )
diff --git a/tools/googleservices/java/com/google/gms/googleservices/GenerateFirebaseXml.java b/tools/googleservices/java/com/google/gms/googleservices/GenerateFirebaseXml.java
new file mode 100644
index 0000000..168f1a7
--- /dev/null
+++ b/tools/googleservices/java/com/google/gms/googleservices/GenerateFirebaseXml.java
@@ -0,0 +1,301 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// Based on:
+// https://android.googlesource.com/platform/tools/base/+/studio-3.0/build-system/google-services/src/main/groovy/com/google/gms/googleservices/GoogleServicesTask.java
+
+package com.google.gms.googleservices;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import com.google.gson.JsonPrimitive;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.Map;
+import java.util.TreeMap;
+
+/**
+ * Creates Android resource XML for Google services (e.g. FCM) from a
+ * google-services.json file.
+ * 
+ * Command line:
+ * packageName inputJsonFile outputXmlFile
+ */
+public class GenerateFirebaseXml {
+
+  private static final String STATUS_DISABLED = "1";
+  private static final String STATUS_ENABLED = "2";
+  private static final int WEB_CLIENT_TYPE = 3;
+
+  public static void main(String[] args) throws Exception {
+    
+    if (args.length != 3) {
+      System.err.println("3 arguments required:");
+      System.err.println("packageName inputJsonFile outputXmlFile");
+      System.exit(1);
+    }
+    
+    String packageName = args[0];
+    String inputJsonFile = args[1];
+    String outputXmlFile = args[2];
+
+    JsonElement root = new JsonParser().parse(Files.newBufferedReader(Paths.get(inputJsonFile)));
+
+    if (!root.isJsonObject()) {
+      throw new Exception("Malformed root json");
+    }
+
+    JsonObject rootObject = root.getAsJsonObject();
+
+    Map<String, String> resValues = new TreeMap<>();
+    Map<String, Map<String, String>> resAttributes = new TreeMap<>();
+
+    handleProjectInfo(rootObject, resValues);
+
+    JsonObject clientObject = getClientForPackageName(packageName, rootObject);
+
+    if (clientObject != null) {
+      handleDefaultWebClientId(clientObject, resValues);
+      handleApiKey(clientObject, resValues);
+      handleAdsService(clientObject, resValues);
+      handleMapsService(clientObject, resValues);
+      handleGoogleAppId(clientObject, resValues);
+    } else {
+      throw new RuntimeException("No matching client found for package name '" + packageName + "'");
+    }
+
+    try(BufferedWriter w = Files.newBufferedWriter(Paths.get(outputXmlFile))) {
+      w.write(getValuesContent(resValues, resAttributes));
+    }
+  }
+
+  private static void handleProjectInfo(JsonObject rootObject, Map<String, String> resValues)
+      throws IOException {
+    JsonObject projectInfo = rootObject.getAsJsonObject("project_info");
+    if (projectInfo == null) {
+      throw new RuntimeException("Missing project_info object");
+    }
+
+    JsonPrimitive projectNumber = projectInfo.getAsJsonPrimitive("project_number");
+    if (projectNumber == null) {
+      throw new RuntimeException("Missing project_info/project_number object");
+    }
+
+    resValues.put("gcm_defaultSenderId", projectNumber.getAsString());
+
+    addProjectInfo(projectInfo, resValues, "project_id", "project_id");
+    addProjectInfo(projectInfo, resValues, "firebase_url", "firebase_database_url");
+    addProjectInfo(projectInfo, resValues, "storage_bucket", "google_storage_bucket");
+  }
+
+  private static void addProjectInfo(
+      JsonObject projectInfo, Map<String, String> resValues, String sourceName, String destName)
+  {
+    if (projectInfo.has(sourceName)) {
+      resValues.put(destName, projectInfo.getAsJsonPrimitive(sourceName).getAsString());
+    }
+  }
+
+  private static void handleDefaultWebClientId(JsonObject clientObject,
+      Map<String, String> resValues) {
+    for (JsonElement oauthClientElement : clientObject.getAsJsonArray("oauth_client")) {
+      JsonObject oauthClient = oauthClientElement.getAsJsonObject();
+      int clientType = oauthClient.getAsJsonPrimitive("client_type").getAsInt();
+      if (clientType == WEB_CLIENT_TYPE) {
+        String clientId = oauthClient.getAsJsonPrimitive("client_id").getAsString();
+        resValues.put("default_web_client_id", clientId);
+        return;
+      }
+    }
+  }
+
+  private static void handleApiKey(JsonObject clientObject, Map<String, String> resValues) {
+    if (clientObject.has("api_key")) {
+      JsonArray apiKeys = clientObject.getAsJsonArray("api_key");
+      JsonObject firstApiKey = apiKeys.get(0).getAsJsonObject();
+      String currentKey = firstApiKey.getAsJsonPrimitive("current_key").getAsString();
+      resValues.put("google_api_key", currentKey);
+      resValues.put("google_crash_reporting_api_key", currentKey);
+    }
+  }
+
+  /**
+   * Handle a client object for analytics (@xml/global_tracker)
+   * @param clientObject the client Json object.
+   * @throws IOException
+   */
+  private static void handleAdsService(JsonObject clientObject, Map<String, String> resValues)
+      throws IOException {
+    JsonObject adsService = getServiceByName(clientObject, "ads_service");
+    if (adsService == null) return;
+
+    findStringByName(adsService, "test_banner_ad_unit_id", resValues);
+    findStringByName(adsService, "test_interstitial_ad_unit_id", resValues);
+  }
+
+  private static void findStringByName(JsonObject jsonObject, String stringName,
+      Map<String, String> resValues) {
+    JsonPrimitive id = jsonObject.getAsJsonPrimitive(stringName);
+    if (id != null) {
+      resValues.put(stringName, id.getAsString());
+    }
+  }
+
+  /**
+   * Handle a client object for maps (@string/google_maps_key).
+   * @param clientObject the client Json object.
+   * @throws IOException
+   */
+  private static void handleMapsService(JsonObject clientObject, Map<String, String> resValues)
+      throws IOException {
+    JsonObject mapsService = getServiceByName(clientObject, "maps_service");
+    if (mapsService == null) return;
+
+    JsonArray array = clientObject.getAsJsonArray("api_key");
+    if (array != null) {
+      final int count = array.size();
+      for (int i = 0 ; i < count ; i++) {
+        JsonElement apiKeyElement = array.get(i);
+        if (apiKeyElement == null || !apiKeyElement.isJsonObject()) {
+          continue;
+        }
+        JsonObject apiKeyObject = apiKeyElement.getAsJsonObject();
+        JsonPrimitive currentKey = apiKeyObject.getAsJsonPrimitive("current_key");
+        if (currentKey == null) {
+          continue;
+        }
+        resValues.put("google_maps_key", currentKey.getAsString());
+        return;
+      }
+    }
+    throw new RuntimeException("Missing api_key/current_key object");
+  }
+
+  /**
+   * Handle a client object for Google App Id.
+   */
+  private static void handleGoogleAppId(JsonObject clientObject, Map<String, String> resValues)
+      throws IOException {
+    JsonObject clientInfo = clientObject.getAsJsonObject("client_info");
+    if (clientInfo == null) {
+      // Should not happen
+      throw new RuntimeException("Client does not have client info");
+    }
+
+    JsonPrimitive googleAppId = clientInfo.getAsJsonPrimitive("mobilesdk_app_id");
+    if (googleAppId == null) return;
+
+    String googleAppIdStr = googleAppId.getAsString();
+    if (googleAppIdStr == null || googleAppIdStr.isEmpty()) return;
+
+    resValues.put("google_app_id", googleAppIdStr);
+  }
+
+  /**
+   * find an item in the "client" array that match the package name of the app
+   * @param jsonObject the root json object.
+   * @return a JsonObject representing the client entry or null if no match is found.
+   */
+  private static JsonObject getClientForPackageName(String packageName, JsonObject jsonObject) {
+    JsonArray array = jsonObject.getAsJsonArray("client");
+    if (array != null) {
+      final int count = array.size();
+      for (int i = 0 ; i < count ; i++) {
+        JsonElement clientElement = array.get(i);
+        if (clientElement == null || !clientElement.isJsonObject()) {
+          continue;
+        }
+
+        JsonObject clientObject = clientElement.getAsJsonObject();
+
+        JsonObject clientInfo = clientObject.getAsJsonObject("client_info");
+        if (clientInfo == null) continue;
+
+        JsonObject androidClientInfo = clientInfo.getAsJsonObject("android_client_info");
+        if (androidClientInfo == null) continue;
+
+        JsonPrimitive clientPackageName = androidClientInfo.getAsJsonPrimitive("package_name");
+        if (clientPackageName == null) continue;
+
+        if (packageName.equals(clientPackageName.getAsString())) {
+          return clientObject;
+        }
+      }
+    }
+
+    return null;
+  }
+
+  /**
+   * Finds a service by name in the client object. Returns null if the service is not found
+   * or if the service is disabled.
+   *
+   * @param clientObject the json object that represents the client.
+   * @param serviceName the service name
+   * @return the service if found.
+   */
+  private static JsonObject getServiceByName(JsonObject clientObject, String serviceName) {
+    JsonObject services = clientObject.getAsJsonObject("services");
+    if (services == null) return null;
+
+    JsonObject service = services.getAsJsonObject(serviceName);
+    if (service == null) return null;
+
+    JsonPrimitive status = service.getAsJsonPrimitive("status");
+    if (status == null) return null;
+
+    String statusStr = status.getAsString();
+
+    if (STATUS_DISABLED.equals(statusStr)) return null;
+    if (!STATUS_ENABLED.equals(statusStr)) {
+      System.err.println(String.format("Status with value '%1$s' for service '%2$s' is unknown",
+          statusStr,
+          serviceName));
+      return null;
+    }
+
+    return service;
+  }
+
+  private static String getValuesContent(Map<String, String> values,
+      Map<String, Map<String, String>> attributes) {
+    StringBuilder sb = new StringBuilder(256);
+
+    sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
+        "<resources>\n");
+
+    for (Map.Entry<String, String> entry : values.entrySet()) {
+      String name = entry.getKey();
+      sb.append("    <string name=\"").append(name).append("\" translatable=\"false\"");
+      if (attributes.containsKey(name)) {
+        for (Map.Entry<String, String> attr : attributes.get(name).entrySet()) {
+          sb.append(" ").append(attr.getKey()).append("=\"")
+              .append(attr.getValue()).append("\"");
+        }
+      }
+      sb.append(">").append(entry.getValue()).append("</string>\n");
+    }
+
+    sb.append("</resources>\n");
+
+    return sb.toString();
+  }
+}
