diff --git a/src/com/google/doclava/Doclava.java b/src/com/google/doclava/Doclava.java
index 48d8ddb..385b2f7 100644
--- a/src/com/google/doclava/Doclava.java
+++ b/src/com/google/doclava/Doclava.java
@@ -452,9 +452,13 @@
           writeSdkValues(sdkValuePath);
         }
       }
-      // Write metadata for all processed files to jd_lists_unified.js in out dir
+      // Write metadata for all processed files to jd_lists_unified in out dir
       if (!sTaglist.isEmpty()) {
         PageMetadata.WriteListByLang(sTaglist);
+        // For devsite (ds) reference only, write samples_metadata to out dir
+        if ((USE_DEVSITE_LOCALE_OUTPUT_PATHS) && (!DEVSITE_STATIC_ONLY)) {
+          PageMetadata.WriteSamplesListByLang(sTaglist);
+        }
       }
     }
 
diff --git a/src/com/google/doclava/PageMetadata.java b/src/com/google/doclava/PageMetadata.java
index 1096f1d..8774d48 100644
--- a/src/com/google/doclava/PageMetadata.java
+++ b/src/com/google/doclava/PageMetadata.java
@@ -92,9 +92,9 @@
   *
   * @param rootTypeNodesList A list of root metadata nodes, each
   *        representing a type and it's member child pages.
+  * @deprecated
   */
   public static void WriteList(List<Node> rootTypeNodesList) {
-
     Collections.sort(rootTypeNodesList, BY_TYPE_NAME);
     Node pageMeta = new Node.Builder().setLabel("TOP").setChildren(rootTypeNodesList).build();
 
@@ -105,7 +105,7 @@
     // write the taglist to js file
     Data data = Doclava.makeHDF();
     data.setValue("reference_tree", buf.toString());
-    ClearPage.write(data, "jd_lists_unified.cs", "jd_lists_unified.js");
+    ClearPage.write(data, "jd_lists_unified.cs",  "jd_lists_unified.js");
   }
 
   /**
@@ -143,6 +143,42 @@
   }
 
   /**
+  * Given a list of metadata nodes organized by lang, sort the
+  * root nodes by type name and render the types and their child
+  * samples metadata nodes only to separate lang-specific json files
+  * in the out dir. Only used by devsite (ds) builds.
+  *
+  * @param rootNodesList A list of root metadata nodes, each
+  *        representing a type and it's member child pages.
+  */
+  public static void WriteSamplesListByLang(List<Node> rootNodesList) {
+    Collections.sort(rootNodesList, BY_LANG_NAME);
+    for (Node n : rootNodesList) {
+      boolean langHasSamples = false;
+      String langFilename = "";
+      String langname = n.getLang();
+      langFilename = "_" + langname;
+      Collections.sort(n.getChildren(), BY_TYPE_NAME);
+      Node pageMeta = new Node.Builder().setLabel("TOP").setChildren(n.getChildren()).build();
+
+      StringBuilder buf = new StringBuilder();
+      // write the taglist to string format
+      langHasSamples = pageMeta.renderSamplesResources(buf,langname);
+      // write the taglist to js file
+      Data data = Doclava.makeHDF();
+      data.setValue("reference_tree", buf.toString());
+      data.setValue("metadata.lang", langname);
+
+      if (langHasSamples) {
+        data.setValue("samples_only", "1");
+        // write out jd_lists_unified for each lang
+        String unifiedFilename = "android_samples_metadata" + langFilename + ".js";
+        ClearPage.write(data, "jd_lists_unified.cs", unifiedFilename);
+      }
+    }
+  }
+
+  /**
   * Extract supported metadata values from a page and add them as
   * a child node of a root node based on type. Some metadata values
   * are normalized. Unsupported metadata fields are ignored. See
@@ -745,6 +781,31 @@
         }
       }
     }
+
+    /**
+    * Render a tree of metadata nodes of type 'develop' to extract
+    * samples metadata. Only used by devsite (ds) builds.
+    * @param buf Output buffer to render to.
+    * @return true if samples were rendered to buf
+    */
+    boolean renderSamplesResources(StringBuilder buf, String langname) {
+      boolean langHasSamples = false;
+      List<Node> list = mChildren; //list of type rootnodes
+      if (list == null || list.size() == 0) {
+        buf.append("null");
+      } else {
+        final int n = list.size();
+        for (int i = 0; i < n; i++) {
+          //samples are always in type 'develop', so restrict
+          if ("develop".equals(list.get(i).mType)) {
+            //render this type's children
+            langHasSamples = list.get(i).renderTypeForSamples(buf);
+          }
+        }
+      }
+      return langHasSamples;
+    }
+
     /**
     * Render all metadata nodes for a specific type.
     * @param buf Output buffer to render to.
@@ -793,6 +854,61 @@
     }
 
     /**
+    * Render all metadata nodes for samples only.
+    * Only used by devsite (ds) builds.
+    * @param buf Output buffer to render to.
+    * @return whether any samples were rendered to buf
+    */
+    boolean renderTypeForSamples(StringBuilder buf) {
+      boolean typeHasSamples = false;
+      List<Node> list = mChildren;
+      if (list == null || list.size() == 0) {
+        buf.append("nulltype");
+      } else {
+        final int n = list.size();
+        for (int i = 0; i < n; i++) {
+          // valid samples must have category 'samples'
+          if ("samples".equals(list.get(i).mCategory)) {
+            typeHasSamples = true;
+            buf.append("\n      {\n");
+            buf.append("        \"title\":\"");
+            renderStrWithUcs(buf, list.get(i).mLabel);
+            buf.append("\",\n" );
+            buf.append("        \"summary\":\"");
+            renderStrWithUcs(buf, list.get(i).mSummary);
+            buf.append("\",\n" );
+            buf.append("        \"url\":\"" + list.get(i).mLink + "\",\n" );
+            if (!"".equals(list.get(i).mImage)) {
+              buf.append("        \"image\":\"" + list.get(i).mImage + "\",\n" );
+            }
+            if (!"".equals(list.get(i).mGroup)) {
+              buf.append("        \"group\":\"");
+              renderStrWithUcs(buf, list.get(i).mGroup);
+              buf.append("\",\n" );
+            }
+            if (!"".equals(list.get(i).mCategory)) {
+              buf.append("        \"category\":\"" + list.get(i).mCategory + "\",\n" );
+            }
+            if ((list.get(i).mType != null) && (list.get(i).mType != "")) {
+              buf.append("        \"type\":\"" + list.get(i).mType + "\",\n");
+            }
+            list.get(i).renderArrayType(buf, list.get(i).mKeywords, "keywords");
+            list.get(i).renderArrayType(buf, list.get(i).mTags, "tags");
+            if (!"".equals(list.get(i).mTimestamp)) {
+              buf.append("        \"timestamp\":\"" + list.get(i).mTimestamp + "\",\n");
+            }
+            buf.append("        \"lang\":\"" + list.get(i).mLang + "\"" );
+            buf.append("\n      }");
+            if (i != n - 1) {
+              buf.append(", ");
+            }
+          }
+        }
+      }
+      return typeHasSamples;
+    }
+
+    /**
     * Build and render a list of tags associated with each type.
     * @param buf Output buffer to render to.
     */
