diff --git a/src/com/google/enterprise/adaptor/sharepoint/RareModificationCache.java b/src/com/google/enterprise/adaptor/sharepoint/RareModificationCache.java
index d74c38a..1dc17f4 100644
--- a/src/com/google/enterprise/adaptor/sharepoint/RareModificationCache.java
+++ b/src/com/google/enterprise/adaptor/sharepoint/RareModificationCache.java
@@ -171,6 +171,7 @@
     public final TrueFalseType allowAnonymousAccess;
     public final TrueFalseType anonymousViewListItems;
     public final long anonymousPermMask;
+    public final String webTitle;
 
     public CachedWeb(Web w) {
       this.noIndex = w.getMetadata().getNoIndex();
@@ -178,6 +179,7 @@
       this.anonymousViewListItems = w.getMetadata().getAnonymousViewListItems();
       this.anonymousPermMask
           = w.getMetadata().getAnonymousPermMask().longValue();
+      this.webTitle = w.getMetadata().getTitle();
     }
   }
 
diff --git a/src/com/google/enterprise/adaptor/sharepoint/SharePointAdaptor.java b/src/com/google/enterprise/adaptor/sharepoint/SharePointAdaptor.java
index 822cf76..3658863 100644
--- a/src/com/google/enterprise/adaptor/sharepoint/SharePointAdaptor.java
+++ b/src/com/google/enterprise/adaptor/sharepoint/SharePointAdaptor.java
@@ -194,6 +194,11 @@
   private static final String IDENTITY_CLAIMS_PREFIX = "i:0";
 
   private static final String OTHER_CLAIMS_PREFIX = "c:0";
+  
+  private static final String METADATA_OBJECT_TYPE = "google:objecttype";
+  private static final String METADATA_PARENT_WEB_TITLE 
+      = "sharepoint:parentwebtitle";
+  private static final String METADATA_LIST_GUID = "sharepoint:listguid";
 
   private static final Logger log
       = Logger.getLogger(SharePointAdaptor.class.getName());
@@ -815,6 +820,9 @@
           .setEverythingCaseInsensitive()
           .setInheritanceType(Acl.InheritanceType.PARENT_OVERRIDES)
           .setPermits(permits).setDenies(denies).build());
+      
+      response.addMetadata(METADATA_OBJECT_TYPE,
+          ObjectType.VIRTUAL_SERVER.value());
 
       HtmlResponseWriter writer = createHtmlResponseWriter(response);
       writer.start(request.getDocId(), ObjectType.VIRTUAL_SERVER,
@@ -921,6 +929,10 @@
             .setInheritanceType(Acl.InheritanceType.PARENT_OVERRIDES)
             .build());
       }
+      
+      response.addMetadata(METADATA_OBJECT_TYPE, ObjectType.SITE.value());
+      response.addMetadata(METADATA_PARENT_WEB_TITLE,
+          w.getMetadata().getTitle());      
 
       response.setDisplayUrl(spUrlToUri(w.getMetadata().getURL()));
       HtmlResponseWriter writer = createHtmlResponseWriter(response);
@@ -1013,6 +1025,12 @@
             .setInheritanceType(Acl.InheritanceType.PARENT_OVERRIDES)
             .build());
       }
+      
+      response.addMetadata(METADATA_OBJECT_TYPE,
+          ObjectType.LIST.value());
+      response.addMetadata(METADATA_PARENT_WEB_TITLE,
+          w.getMetadata().getTitle());
+      response.addMetadata(METADATA_LIST_GUID, l.getMetadata().getID());
 
       response.setDisplayUrl(sharePointUrlToUri(
           l.getMetadata().getDefaultViewUrl()));
@@ -1258,6 +1276,8 @@
             .setInheritFrom(new DocId(parentId))
             .build());
       }
+      response.addMetadata(METADATA_OBJECT_TYPE, "Aspx");      
+      response.addMetadata(METADATA_PARENT_WEB_TITLE, w.webTitle);
       getFileDocContent(request, response);
       log.exiting("SiteAdaptor", "getAspxDocContent");
     }
@@ -1451,7 +1471,10 @@
         metadataLength
             += addMetadata(response, attribute.getName(), attribute.getValue());
       }
-
+      metadataLength += addMetadata(response,
+          METADATA_PARENT_WEB_TITLE, w.webTitle);
+      metadataLength += addMetadata(response, METADATA_LIST_GUID, listId); 
+      
       if (isFolder) {
         String root = encodeDocId(l.rootFolder).getUniqueId();
         root += "/";
@@ -1475,6 +1498,8 @@
         } catch (URISyntaxException ex) {
           throw new IOException(ex);
         }
+        metadataLength += addMetadata(
+            response, METADATA_OBJECT_TYPE, ObjectType.FOLDER.value());
         HtmlResponseWriter writer
             = createHtmlResponseWriter(response, metadataLength);
         writer.start(request.getDocId(), ObjectType.FOLDER, null);
@@ -1488,6 +1513,8 @@
           && contentTypeId.startsWith(CONTENTTYPEID_DOCUMENT_PREFIX)) {
         // This is a file (or "Document" in SharePoint-speak), so display its
         // contents.
+        metadataLength += addMetadata(
+            response, METADATA_OBJECT_TYPE, "Document");
         getFileDocContent(request, response);
       } else {
         // Some list item.
@@ -1499,6 +1526,8 @@
         } catch (URISyntaxException ex) {
           throw new IOException(ex);
         }
+        metadataLength += addMetadata(
+            response, METADATA_OBJECT_TYPE, ObjectType.LIST_ITEM.value());
         HtmlResponseWriter writer
             = createHtmlResponseWriter(response, metadataLength);
         writer.start(request.getDocId(), ObjectType.LIST_ITEM, title);
@@ -1588,6 +1617,9 @@
             .setInheritFrom(encodeDocId(listItemUrl))
             .build());
       }
+      response.addMetadata(METADATA_OBJECT_TYPE, "Attachment");
+      response.addMetadata(METADATA_PARENT_WEB_TITLE, w.webTitle);
+      response.addMetadata(METADATA_LIST_GUID, listId);
       // If the attachment doesn't exist, then this responds Not Found.
       getFileDocContent(request, response);
       log.exiting("SiteAdaptor", "getAttachmentDocContent", true);
diff --git a/test/com/google/enterprise/adaptor/sharepoint/SharePointAdaptorTest.java b/test/com/google/enterprise/adaptor/sharepoint/SharePointAdaptorTest.java
index 621ffea..84c8fe6 100644
--- a/test/com/google/enterprise/adaptor/sharepoint/SharePointAdaptorTest.java
+++ b/test/com/google/enterprise/adaptor/sharepoint/SharePointAdaptorTest.java
@@ -896,6 +896,9 @@
       meta.add("_UIVersion", "512");
       meta.add("_UIVersionString", "1.0");
       meta.add("owshiddenversion", "4");
+      meta.add("sharepoint:parentwebtitle", "chinese1");
+      meta.add("sharepoint:listguid", "{6F33949A-B3FF-4B0C-BA99-93CB518AC2C0}");
+      meta.add("google:objecttype", "ListItem");
       goldenMetadata = meta.unmodifiableView();
     }
     assertEquals(golden, responseString);
@@ -1141,6 +1144,9 @@
       meta.add("_UIVersion", "512");
       meta.add("_UIVersionString", "1.0");
       meta.add("owshiddenversion", "1");
+      meta.add("sharepoint:parentwebtitle", "chinese1");
+      meta.add("sharepoint:listguid", "{6F33949A-B3FF-4B0C-BA99-93CB518AC2C0}");
+      meta.add("google:objecttype", "Folder");
       goldenMetadata = meta.unmodifiableView();
     }
     assertEquals(golden, responseString);
