diff --git a/src/com/google/wireless/gdata2/calendar/client/CalendarClient.java b/src/com/google/wireless/gdata2/calendar/client/CalendarClient.java
index 8bac2fa..3a25762 100644
--- a/src/com/google/wireless/gdata2/calendar/client/CalendarClient.java
+++ b/src/com/google/wireless/gdata2/calendar/client/CalendarClient.java
@@ -90,7 +90,7 @@
     public GDataParser getParserForUserCalendars(String feedUrl, String authToken)
             throws ParseException, IOException, HttpException {
         GDataClient gDataClient = getGDataClient();
-        InputStream is = gDataClient.getFeedAsStream(feedUrl, authToken);
+        InputStream is = gDataClient.getFeedAsStream(feedUrl, authToken, null /* etag */);
         return getGDataParserFactory().createParser(CalendarEntry.class, is);
     }
 }
diff --git a/src/com/google/wireless/gdata2/client/GDataClient.java b/src/com/google/wireless/gdata2/client/GDataClient.java
index 0568f71..ef3d108 100644
--- a/src/com/google/wireless/gdata2/client/GDataClient.java
+++ b/src/com/google/wireless/gdata2/client/GDataClient.java
@@ -45,13 +45,17 @@
      * @param feedUrl The feed that should be fetched.
      * @param authToken The authentication token that should be used when
      * fetching the feed.
+     * @param eTag The eTag associated with this request, this will 
+     *             cause the GET to return a 304 if the content was
+     *             not modified. The parameter can be null
      * @return An InputStream for the feed.
      * @throws IOException Thrown if an io error occurs while communicating with
      * the service.
      * @throws HttpException if the service returns an error response.
      */
     InputStream getFeedAsStream(String feedUrl,
-                                String authToken)
+                                String authToken,
+                                String eTag)
         throws HttpException, IOException;
 
     /**
@@ -62,12 +66,15 @@
      * @param mediaEntryUrl The media entry that should be fetched.
      * @param authToken The authentication token that should be used when
      * fetching the media entry.
+     * @param eTag The eTag associated with this request, this will 
+     *             cause the GET to return a 304 if the content was
+     *             not modified.
      * @return An InputStream for the media entry.
      * @throws IOException Thrown if an io error occurs while communicating with
      * the service.
      * @throws HttpException if the service returns an error response.
      */
-    InputStream getMediaEntryAsStream(String mediaEntryUrl, String authToken)
+    InputStream getMediaEntryAsStream(String mediaEntryUrl, String authToken, String eTag)
         throws HttpException, IOException;
 
     // TODO: support batch update
@@ -100,6 +107,9 @@
      * @param editUri The edit uri that should be used for updating the entry.
      * @param authToken The authentication token that should be used when 
      * updating the entry.
+     * @param eTag The eTag associated with this request, this will 
+     *             cause the PUT to return a conflict if the
+     *             resource was already modified
      * @param entry The entry that should be updated.
      * @throws IOException Thrown if an io error occurs while communicating with
      * the service.
@@ -107,6 +117,7 @@
      */
     InputStream updateEntry(String editUri,
                             String authToken,
+                            String eTag,
                             GDataSerializer entry)
         throws HttpException, IOException;
 
@@ -117,12 +128,16 @@
      * @param editUri The edit uri that should be used for deleting the entry.
      * @param authToken The authentication token that should be used when
      * deleting the entry.
+     * @param eTag The eTag associated with this request, this will 
+     *             cause a failure if the resource was modified
+     *             since retrieval.
      * @throws IOException Thrown if an io error occurs while communicating with
      * the service.
      * @throws HttpException if the service returns an error response.
      */
     void deleteEntry(String editUri,
-                     String authToken)
+                     String authToken,
+                     String eTag)
         throws HttpException, IOException;
 
     /**
@@ -133,7 +148,10 @@
      *
      * @param editUri The edit uri that should be used for updating the entry.
      * @param authToken The authentication token that should be used when
-     * updating the entry.
+     * updating the entry 
+     * @param eTag The eTag associated with this request, this will 
+     *             cause the PUT to return a conflict if the
+     *             resource was already modified
      * @param mediaEntryInputStream The {@link InputStream} that contains the new
      *   value of the resource
      * @param contentType The contentType of the new media entry
@@ -143,7 +161,7 @@
      * @return The {@link InputStream} that contains the metadata associated with the
      *   new version of the media entry.
      */
-    public InputStream updateMediaEntry(String editUri, String authToken,
+    public InputStream updateMediaEntry(String editUri, String authToken, String eTag,
             InputStream mediaEntryInputStream, String contentType)
         throws HttpException, IOException;
 }
diff --git a/src/com/google/wireless/gdata2/client/GDataServiceClient.java b/src/com/google/wireless/gdata2/client/GDataServiceClient.java
index 738879e..ca12df3 100644
--- a/src/com/google/wireless/gdata2/client/GDataServiceClient.java
+++ b/src/com/google/wireless/gdata2/client/GDataServiceClient.java
@@ -65,15 +65,17 @@
      * @param feedEntryClass the class of Entry that is contained in the feed
      * @param feedUrl ThAe URL of the feed that should be fetched.
      * @param authToken The authentication token for this user.
+     * @param eTag The etag used for this query. Passing null will 
+     *             result in an unconditional query
      * @return A {@link GDataParser} for the requested feed.
      * @throws ParseException Thrown if the server response cannot be parsed.
      * @throws IOException Thrown if an error occurs while communicating with
      * the GData service.
      * @throws HttpException Thrown if the http response contains a result other than 2xx
      */
-    public GDataParser getParserForFeed(Class feedEntryClass, String feedUrl, String authToken)
+    public GDataParser getParserForFeed(Class feedEntryClass, String feedUrl, String authToken, String eTag)
             throws ParseException, IOException, HttpException {
-        InputStream is = gDataClient.getFeedAsStream(feedUrl, authToken);
+        InputStream is = gDataClient.getFeedAsStream(feedUrl, authToken, eTag);
         return gDataParserFactory.createParser(feedEntryClass, is);
     }
 
@@ -83,13 +85,16 @@
      *
      * @param mediaEntryUrl The URL of the media entry that should be fetched.
      * @param authToken The authentication token for this user.
-     * @return A {@link InputStream} for the requested media entry.
+     * @param eTag The eTag associated with this request, this will 
+     *             cause the GET to return a 304 if the content was
+     *             not modified.
+    * @return A {@link InputStream} for the requested media entry.
      * @throws IOException Thrown if an error occurs while communicating with
      * the GData service.
      */
-    public InputStream getMediaEntryAsStream(String mediaEntryUrl, String authToken)
+    public InputStream getMediaEntryAsStream(String mediaEntryUrl, String authToken, String eTag)
             throws IOException, HttpException {
-        return gDataClient.getMediaEntryAsStream(mediaEntryUrl, authToken);
+        return gDataClient.getMediaEntryAsStream(mediaEntryUrl, authToken, eTag);
     }
 
     /**
@@ -117,16 +122,18 @@
    * Fetches an existing entry.
    * @param entryClass the type of entry to expect
    * @param id of the entry to fetch.
-   * @param authToken The authentication token for this user. @return The entry returned by the server.
+   * @param authToken The authentication token for this user 
+   * @param eTag The etag used for this query. Passing null
+   *        will result in an unconditional query
    * @throws ParseException Thrown if the server response cannot be parsed.
    * @throws HttpException if the service returns an error response
    * @throws IOException Thrown if an error occurs while communicating with
    * the GData service.
    * @return The entry returned by the server
    */
-    public Entry getEntry(Class entryClass, String id, String authToken)
+    public Entry getEntry(Class entryClass, String id, String authToken, String eTag)
           throws ParseException, IOException, HttpException {
-        InputStream is = getGDataClient().getFeedAsStream(id, authToken);
+        InputStream is = getGDataClient().getFeedAsStream(id, authToken, eTag);
         return parseEntry(entryClass, is);
     }
 
@@ -151,7 +158,7 @@
         }
 
         GDataSerializer serializer = gDataParserFactory.createSerializer(entry);
-        InputStream is = gDataClient.updateEntry(editUri, authToken, serializer);
+        InputStream is = gDataClient.updateEntry(editUri, authToken, entry.getETag(), serializer);
         return parseEntry(entry.getClass(), is);
     }
 
@@ -165,19 +172,21 @@
      * @param contentType The content type of the new media entry
      * @param authToken The authentication token for this user.
      * @return The entry returned by the server as a result of updating the
-     * provided entry.
+     * provided entry 
+     * @param eTag The etag used for this query. Passing null will 
+     *             result in an unconditional query
      * @throws HttpException if the service returns an error response
      * @throws ParseException Thrown if the server response cannot be parsed.
      * @throws IOException Thrown if an error occurs while communicating with
      * the GData service.
      */
     public MediaEntry updateMediaEntry(String editUri, InputStream inputStream, String contentType,
-            String authToken) throws IOException, HttpException, ParseException {
+            String authToken, String eTag) throws IOException, HttpException, ParseException {
         if (StringUtils.isEmpty(editUri)) {
             throw new IllegalArgumentException("No edit URI -- cannot update.");
         }
 
-        InputStream is = gDataClient.updateMediaEntry(editUri, authToken, inputStream, contentType);
+        InputStream is = gDataClient.updateMediaEntry(editUri, authToken, eTag, inputStream, contentType);
         return (MediaEntry)parseEntry(MediaEntry.class, is);
     }
 
@@ -186,13 +195,15 @@
      *
      * @param editUri The editUri for the entry that should be deleted.
      * @param authToken The authentication token for this user.
+     * @param eTag The etag used for this query. Passing null will 
+     *             result in an unconditional query
      * @throws IOException Thrown if an error occurs while communicating with
      * the GData service.
      * @throws HttpException if the service returns an error response
      */
-    public void deleteEntry(String editUri, String authToken)
+    public void deleteEntry(String editUri, String authToken, String eTag)
             throws IOException, HttpException {
-        gDataClient.deleteEntry(editUri, authToken);
+        gDataClient.deleteEntry(editUri, authToken, eTag);
     }
 
     private Entry parseEntry(Class entryClass, InputStream is) throws ParseException, IOException {
diff --git a/src/com/google/wireless/gdata2/contacts/data/ContactEntry.java b/src/com/google/wireless/gdata2/contacts/data/ContactEntry.java
index f21e60f..f22eaf0 100644
--- a/src/com/google/wireless/gdata2/contacts/data/ContactEntry.java
+++ b/src/com/google/wireless/gdata2/contacts/data/ContactEntry.java
@@ -15,9 +15,8 @@
  */
 public class ContactEntry extends Entry {
   private String linkPhotoHref;
-  private String linkEditPhotoHref;
   private String linkPhotoType;
-  private String linkEditPhotoType;
+  private String linkPhotoEtag;
   private final Vector emailAddresses = new Vector();
   private final Vector imAddresses = new Vector();
   private final Vector phoneNumbers = new Vector();
@@ -31,22 +30,15 @@
     super();
   }
 
-  public void setLinkEditPhoto(String href, String type) {
-    this.linkEditPhotoHref = href;
-    this.linkEditPhotoType = type;
-  }
 
-  public String getLinkEditPhotoHref() {
-    return linkEditPhotoHref;
-  }
-
-  public String getLinkEditPhotoType() {
-    return linkEditPhotoType;
-  }
-
-  public void setLinkPhoto(String href, String type) {
+  public void setLinkPhoto(String href, String type, String photoEtag) {
     this.linkPhotoHref = href;
     this.linkPhotoType = type;
+    this.linkPhotoEtag = photoEtag;
+  }
+
+  public String getLinkPhotoETag() {
+      return linkPhotoEtag;
   }
 
   public String getLinkPhotoHref() {
@@ -127,10 +119,9 @@
   */
   public void clear() {
     super.clear();
-    linkEditPhotoHref = null;
-    linkEditPhotoType = null;
     linkPhotoHref = null;
     linkPhotoType = null;
+    linkPhotoEtag = null;
     emailAddresses.removeAllElements();
     imAddresses.removeAllElements();
     phoneNumbers.removeAllElements();
@@ -151,11 +142,8 @@
     if (!StringUtils.isEmpty(linkPhotoType)) {
       sb.append(" linkPhotoType:").append(linkPhotoType).append("\n");
     }
-    if (!StringUtils.isEmpty(linkEditPhotoHref)) {
-      sb.append(" linkEditPhotoHref:").append(linkEditPhotoHref).append("\n");
-    }
-    if (!StringUtils.isEmpty(linkEditPhotoType)) {
-      sb.append(" linkEditPhotoType:").append(linkEditPhotoType).append("\n");
+     if (!StringUtils.isEmpty(linkPhotoEtag)) {
+      sb.append(" linkPhotoEtag:").append(linkPhotoEtag).append("\n");
     }
     for (Enumeration iter = emailAddresses.elements();
         iter.hasMoreElements(); ) {
diff --git a/src/com/google/wireless/gdata2/contacts/parser/xml/XmlContactsGDataParser.java b/src/com/google/wireless/gdata2/contacts/parser/xml/XmlContactsGDataParser.java
index eed6c54..d37cc7a 100644
--- a/src/com/google/wireless/gdata2/contacts/parser/xml/XmlContactsGDataParser.java
+++ b/src/com/google/wireless/gdata2/contacts/parser/xml/XmlContactsGDataParser.java
@@ -247,11 +247,10 @@
       throws XmlPullParserException, IOException {
     if (LINK_REL_PHOTO.equals(rel)) {
       ContactEntry contactEntry = (ContactEntry) entry;
-      contactEntry.setLinkPhoto(href, type);
-    } else if (LINK_REL_EDIT_PHOTO.equals(rel)) {
-      ContactEntry contactEntry = (ContactEntry) entry;
-      contactEntry.setLinkEditPhoto(href, type);
-    }
+      XmlPullParser parser = getParser();  
+      String etag = parser.getAttributeValue(null  /* ns */, "etag");
+      contactEntry.setLinkPhoto(href, type, etag);
+    } 
   }
 
   private static void parseContactsElement(ContactsElement element, XmlPullParser parser,
diff --git a/src/com/google/wireless/gdata2/contacts/serializer/xml/XmlContactEntryGDataSerializer.java b/src/com/google/wireless/gdata2/contacts/serializer/xml/XmlContactEntryGDataSerializer.java
index 1b5c5fb..d27c16f 100644
--- a/src/com/google/wireless/gdata2/contacts/serializer/xml/XmlContactEntryGDataSerializer.java
+++ b/src/com/google/wireless/gdata2/contacts/serializer/xml/XmlContactEntryGDataSerializer.java
@@ -33,6 +33,7 @@
     super(factory, entry);
   }
 
+  @Override
   protected void declareExtraEntryNamespaces(XmlSerializer serializer) throws IOException {
     super.declareExtraEntryNamespaces(serializer);
     serializer.setPrefix(XmlContactsGDataParser.NAMESPACE_CONTACTS,
@@ -51,10 +52,8 @@
     ContactEntry entry = getContactEntry();
     entry.validate();
 
-    serializeLink(serializer, XmlContactsGDataParser.LINK_REL_EDIT_PHOTO,
-        entry.getLinkEditPhotoHref(), entry.getLinkEditPhotoType());
     serializeLink(serializer, XmlContactsGDataParser.LINK_REL_PHOTO,
-        entry.getLinkPhotoHref(), entry.getLinkPhotoType());
+        entry.getLinkPhotoHref(), entry.getLinkPhotoType(), entry.getLinkPhotoETag());
 
     // Serialize the contact specific parts of this entry.  Note that
     // gd:ContactSection and gd:geoPt are likely to be deprecated, and
diff --git a/src/com/google/wireless/gdata2/data/Entry.java b/src/com/google/wireless/gdata2/data/Entry.java
index 1c191d4..fff706e 100644
--- a/src/com/google/wireless/gdata2/data/Entry.java
+++ b/src/com/google/wireless/gdata2/data/Entry.java
@@ -24,6 +24,7 @@
     private String categoryScheme = null;
     private String publicationDate = null;
     private String updateDate = null;
+    private String eTagValue = null;
     private boolean deleted = false;
     
     /**
@@ -219,6 +220,21 @@
     public void setDeleted(boolean isDeleted) {
         deleted = isDeleted;
     }
+
+    /**
+    * @return the value of the parsed eTag attribute 
+    */
+    public String getETag() {
+        return eTagValue;
+    }
+
+    /**
+     * @param sets the eTag on the entry, used during 
+     *           parsing
+     */
+    public void setETag(String eTag) {
+        eTagValue = eTag;
+    }
  
     /**
      * Appends the name and value to this StringBuffer, if value is not null.
diff --git a/src/com/google/wireless/gdata2/data/Feed.java b/src/com/google/wireless/gdata2/data/Feed.java
index 201a134..dd9779c 100644
--- a/src/com/google/wireless/gdata2/data/Feed.java
+++ b/src/com/google/wireless/gdata2/data/Feed.java
@@ -18,6 +18,7 @@
     private String lastUpdated;
     private String category;
     private String categoryScheme;
+    private String eTagValue;
 
     /**
      * Creates a new, empty feed.
@@ -119,4 +120,19 @@
         this.title = title;
     }
 
+    /**
+    * @return the value of the parsed eTag attribute 
+    */
+    public String getETag() {
+        return eTagValue;
+    }
+
+    /**
+     * @param sets the eTag on the entry, used during 
+     *           parsing
+     */
+    public void setETag(String eTag) {
+        eTagValue = eTag;
+    }
+ 
 }
diff --git a/src/com/google/wireless/gdata2/parser/xml/XmlGDataParser.java b/src/com/google/wireless/gdata2/parser/xml/XmlGDataParser.java
index 9cd3e23..44fd2a2 100644
--- a/src/com/google/wireless/gdata2/parser/xml/XmlGDataParser.java
+++ b/src/com/google/wireless/gdata2/parser/xml/XmlGDataParser.java
@@ -28,7 +28,7 @@
   public static final String NAMESPACE_OPENSEARCH = "openSearch";
 
   public static final String NAMESPACE_OPENSEARCH_URI =
-      "http://a9.com/-/spec/opensearchrss/1.0/";
+      "http://a9.com/-/spec/opensearch/1.1/";
 
   /** Namespace prefix for GData */
   public static final String NAMESPACE_GD = "gd";
@@ -51,6 +51,13 @@
       throws ParseException {
     this.is = is;
     this.parser = parser;
+
+    if (!parser.getFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES))
+    {
+      throw new IllegalStateException("A XmlGDataParser needs to be " 
+          + "constructed with a namespace aware XmlPullParser");
+    }
+
     this.isInBadState = false;
     if (this.is != null) {
       try {
@@ -142,8 +149,9 @@
   }
 
   /**
-   * Parses the feed (but not any entries).
-   *
+   * Parses the feed (but not any entries). This requires a 
+   * namespace enabled parser 
+   * 
    * @return A new {@link Feed} containing information about the feed.
    * @throws XmlPullParserException Thrown if the XML document cannot be
    * parsed.
@@ -154,41 +162,51 @@
     Feed feed = createFeed();
     // parsing <feed>
     // not interested in any attributes -- move onto the children.
+    
+    feed.setETag(parser.getAttributeValue(NAMESPACE_GD_URI, "etag"));
+  
+
     int eventType = parser.next();
     while (eventType != XmlPullParser.END_DOCUMENT) {
       switch (eventType) {
         case XmlPullParser.START_TAG:
           String name = parser.getName();
-          if ("totalResults".equals(name)) {
-            feed.setTotalResults(StringUtils.parseInt(
-                XmlUtils.extractChildText(parser), 0));
-          } else if ("startIndex".equals(name)) {
-            feed.setStartIndex(StringUtils.parseInt(
-                XmlUtils.extractChildText(parser), 0));
-          } else if ("itemsPerPage".equals(name)) {
-            feed.setItemsPerPage(StringUtils.parseInt(
-                XmlUtils.extractChildText(parser), 0));
-          } else if ("title".equals(name)) {
-            feed.setTitle(XmlUtils.extractChildText(parser));
-          } else if ("id".equals(name)) {
-            feed.setId(XmlUtils.extractChildText(parser));
-          } else if ("updated".equals(name)) {
-            feed.setLastUpdated(XmlUtils.extractChildText(parser));
-          } else if ("category".equals(name)) {
-            String category =
-                parser.getAttributeValue(null /* ns */, "term");
-            if (!StringUtils.isEmpty(category)) {
-              feed.setCategory(category);
+          String namespace = parser.getNamespace(); 
+
+          if (XmlGDataParser.NAMESPACE_OPENSEARCH_URI.equals(namespace)) {
+            if ("totalResults".equals(name)) {
+              feed.setTotalResults(StringUtils.parseInt(
+                  XmlUtils.extractChildText(parser), 0));
+            } else if ("startIndex".equals(name)) {
+              feed.setStartIndex(StringUtils.parseInt(
+                  XmlUtils.extractChildText(parser), 0));
+            } else if ("itemsPerPage".equals(name)) {
+              feed.setItemsPerPage(StringUtils.parseInt(
+                  XmlUtils.extractChildText(parser), 0));
             }
-            String categoryScheme =
-                parser.getAttributeValue(null /* ns */, "scheme");
-            if (!StringUtils.isEmpty(categoryScheme)) {
-              feed.setCategoryScheme(categoryScheme);
-            }
-          } else if ("entry".equals(name)) {
-            // stop parsing here.
-            // TODO: pay attention to depth?
-            return feed;
+          } else if (XmlGDataParser.NAMESPACE_ATOM_URI.equals(namespace)) {
+            if ("title".equals(name)) {
+              feed.setTitle(XmlUtils.extractChildText(parser));
+            } else if ("id".equals(name)) {
+              feed.setId(XmlUtils.extractChildText(parser));
+            } else if ("updated".equals(name)) {
+              feed.setLastUpdated(XmlUtils.extractChildText(parser));
+            } else if ("category".equals(name)) {
+              String category =
+                  parser.getAttributeValue(null /* ns */, "term");
+              if (!StringUtils.isEmpty(category)) {
+                feed.setCategory(category);
+              }
+              String categoryScheme =
+                  parser.getAttributeValue(null /* ns */, "scheme");
+              if (!StringUtils.isEmpty(categoryScheme)) {
+                feed.setCategoryScheme(categoryScheme);
+              }
+            } else if ("entry".equals(name)) {
+              // stop parsing here.
+              // TODO: pay attention to depth?
+              return feed;
+            } 
           } else {
             handleExtraElementInFeed(feed);
           }
@@ -262,7 +280,6 @@
     }
 
     try {
-      parser.next();
       handleEntry(entry);
       entry.validate();
     } catch (ParseException xppe1) {
@@ -321,7 +338,6 @@
           String name = parser.getName();
           if ("entry".equals(name)) {
             try {
-              parser.next();
               handleEntry(entry);
               return entry;
             } catch (XmlPullParserException xppe) {
@@ -373,7 +389,8 @@
 
   /**
    * Parses the current entry in the XML document.  Assumes that the parser
-   * is currently pointing just after an &lt;entry&gt;.
+   * is currently pointing just at the beginning of an 
+   * &lt;entry&gt;. 
    *
    * @param entry The entry that will be filled.
    * @throws XmlPullParserException Thrown if the XML cannot be parsed.
@@ -381,6 +398,18 @@
    */
   protected void handleEntry(Entry entry)
       throws XmlPullParserException, IOException, ParseException {
+    // first thing we do is to get the attributes out of the parser for this entry
+    // so we verify that we are at the start of an entry
+    if (!"entry".equals(parser.getName())) {
+       throw new
+         IllegalStateException("Expected <entry>: Actual element: <"
+         + parser.getName() + ">");
+    }
+          
+    entry.setETag(parser.getAttributeValue(NAMESPACE_GD_URI, "etag"));
+    // now skip to the next parser event
+    parser.next();
+
     int eventType = parser.getEventType();
     while (eventType != XmlPullParser.END_DOCUMENT) {
       switch (eventType) {
diff --git a/src/com/google/wireless/gdata2/serializer/xml/XmlEntryGDataSerializer.java b/src/com/google/wireless/gdata2/serializer/xml/XmlEntryGDataSerializer.java
index 210f76c..23036ea 100644
--- a/src/com/google/wireless/gdata2/serializer/xml/XmlEntryGDataSerializer.java
+++ b/src/com/google/wireless/gdata2/serializer/xml/XmlEntryGDataSerializer.java
@@ -109,8 +109,8 @@
     serializeTitle(serializer, entry.getTitle());
 
     if (format != FORMAT_CREATE) {
-      serializeLink(serializer, "edit" /* rel */, entry.getEditUri(), null /* type */);
-      serializeLink(serializer, "alternate" /* rel */, entry.getHtmlUri(), "text/html" /* type */);
+      serializeLink(serializer, "edit" /* rel */, entry.getEditUri(), null /* type */, null /* etag */ );
+      serializeLink(serializer, "alternate" /* rel */, entry.getHtmlUri(), "text/html" /* type */, null /* etag */ );
     }
 
     serializeSummary(serializer, entry.getSummary());
@@ -172,7 +172,18 @@
     serializer.endTag(null /* ns */, "title");
   }
 
-  public static void serializeLink(XmlSerializer serializer, String rel, String href, String type)
+  /**
+   * Serializes a link relationship into the xml serializer passed in.
+   * 
+   * @param serializer The serializer to be used
+   * @param rel        The relationship value (like alternate, edit etc)
+   * @param href       the URI this link points to
+   * @param type       the content type
+   * @param etag       the optional etag if this link specifies a resource
+   * 
+   * @exception IOException
+   */
+  protected static void serializeLink(XmlSerializer serializer, String rel, String href, String type, String etag)
       throws IOException {
     if (StringUtils.isEmpty(href)) {
       return;
@@ -181,6 +192,7 @@
     serializer.attribute(null /* ns */, "rel", rel);
     serializer.attribute(null /* ns */, "href", href);
     if (!StringUtils.isEmpty(type)) serializer.attribute(null /* ns */, "type", type);
+    if (!StringUtils.isEmpty(etag)) serializer.attribute(null /* ns */, "etag", etag);
     serializer.endTag(null /* ns */, "link");
   }
 
diff --git a/src/com/google/wireless/gdata2/spreadsheets/client/SpreadsheetsClient.java b/src/com/google/wireless/gdata2/spreadsheets/client/SpreadsheetsClient.java
deleted file mode 100755
index 585c0a3..0000000
--- a/src/com/google/wireless/gdata2/spreadsheets/client/SpreadsheetsClient.java
+++ /dev/null
@@ -1,236 +0,0 @@
-// Copyright 2007 The Android Open Source Project
-package com.google.wireless.gdata2.spreadsheets.client;
-
-import com.google.wireless.gdata2.client.GDataClient;
-import com.google.wireless.gdata2.client.GDataParserFactory;
-import com.google.wireless.gdata2.client.GDataServiceClient;
-import com.google.wireless.gdata2.client.HttpException;
-import com.google.wireless.gdata2.data.Entry;
-import com.google.wireless.gdata2.data.StringUtils;
-import com.google.wireless.gdata2.parser.GDataParser;
-import com.google.wireless.gdata2.parser.ParseException;
-import com.google.wireless.gdata2.serializer.GDataSerializer;
-import com.google.wireless.gdata2.spreadsheets.data.CellEntry;
-import com.google.wireless.gdata2.spreadsheets.data.ListEntry;
-import com.google.wireless.gdata2.spreadsheets.data.SpreadsheetEntry;
-import com.google.wireless.gdata2.spreadsheets.data.WorksheetEntry;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * GDataServiceClient for accessing Google Spreadsheets. This client can
- * access and parse all of the Spreadsheets feed types: Spreadsheets feed,
- * Worksheets feed, List feed, and Cells feed. Read operations are supported
- * on all feed types, but only the List and Cells feeds support write
- * operations. (This is a limitation of the protocol, not this API. Such write
- * access may be added to the protocol in the future, requiring changes to
- * this implementation.)
- * 
- * Only 'private' visibility and 'full' projections are currently supported.
- */
-public class SpreadsheetsClient extends GDataServiceClient {
-    /** The name of the service, dictated to be 'wise' by the protocol. */
-    private static final String SERVICE = "wise";
-
-    /** Standard base feed url for spreadsheets. */
-    public static final String SPREADSHEETS_BASE_FEED_URL =
-            "http://spreadsheets.google.com/feeds/spreadsheets/private/full";
-
-    /** Base feed url for spreadsheets. */
-    private final String baseFeedUrl;
-
-    /**
-     * Create a new SpreadsheetsClient.
-     *
-     * @param client The GDataClient that should be used to authenticate
-     *        requests, retrieve feeds, etc.
-     * @param spreadsheetFactory The GDataParserFactory that should be used to obtain GDataParsers
-     * used by this client.
-     * @param baseFeedUrl The base URL for spreadsheets feeds.
-     */
-    public SpreadsheetsClient(GDataClient client,
-            GDataParserFactory spreadsheetFactory,
-            String baseFeedUrl) {
-        super(client, spreadsheetFactory);
-        this.baseFeedUrl = baseFeedUrl;
-    }
-
-    /**
-     * Create a new SpreadsheetsClient.  Uses the standard base URL for spreadsheets feeds.
-     * 
-     * @param client The GDataClient that should be used to authenticate
-     *        requests, retrieve feeds, etc.
-     */
-    public SpreadsheetsClient(GDataClient client,
-            GDataParserFactory spreadsheetFactory) {
-        this(client, spreadsheetFactory, SPREADSHEETS_BASE_FEED_URL);
-    }
-
-    /* (non-Javadoc)
-     * @see GDataServiceClient#getServiceName
-     */
-    public String getServiceName() {
-        return SERVICE;
-    }
-
-    /**
-     * Returns a parser for the specified feed type.
-     * 
-     * @param feedEntryClass the Class of entry type that will be parsed. This lets this
-     *   method figure out which parser to create.
-     * @param feedUri the URI of the feed to be fetched and parsed
-     * @param authToken the current authToken to use for the request @return a parser for the indicated feed
-     * @throws HttpException if an http error is encountered
-     * @throws ParseException if the response from the server could not be
-     *         parsed
-     */
-    private GDataParser getParserForTypedFeed(Class feedEntryClass, String feedUri,
-            String authToken) throws ParseException, IOException, HttpException {
-        GDataClient gDataClient = getGDataClient();
-        GDataParserFactory gDataParserFactory = getGDataParserFactory();
-
-        InputStream is = gDataClient.getFeedAsStream(feedUri, authToken);
-        return gDataParserFactory.createParser(feedEntryClass, is);
-    }
-
-    /* (non-javadoc)
-     * @see GDataServiceClient#createEntry
-     */
-    public Entry createEntry(String feedUri, String authToken, Entry entry)
-            throws ParseException, IOException, HttpException {
-
-        GDataParserFactory factory = getGDataParserFactory();
-        GDataSerializer serializer = factory.createSerializer(entry);
-
-        InputStream is = getGDataClient().createEntry(feedUri, authToken, serializer);
-        GDataParser parser = factory.createParser(entry.getClass(), is);
-        try {
-            return parser.parseStandaloneEntry();
-        } finally {
-            parser.close();
-        }
-    }
-
-    /**
-     * Returns a parser for a Cells-based feed.
-     *
-     * @param feedUri the URI of the feed to be fetched and parsed
-     * @param authToken the current authToken to use for the request
-     * @return a parser for the indicated feed
-     * @throws HttpException if an http error is encountered
-     * @throws ParseException if the response from the server could not be
-     *         parsed
-     */
-    public GDataParser getParserForCellsFeed(String feedUri, String authToken)
-            throws ParseException, IOException, HttpException {
-        return getParserForTypedFeed(CellEntry.class, feedUri, authToken);
-    }
-
-    /**
-     * Fetches a GDataParser for the indicated feed. The parser can be used to
-     * access the contents of URI. WARNING: because we cannot reliably infer
-     * the feed type from the URI alone, this method assumes the default feed
-     * type! This is probably NOT what you want. Please use the
-     * getParserFor[Type]Feed methods.
-     *
-     * @param feedEntryClass
-     * @param feedUri the URI of the feed to be fetched and parsed
-     * @param authToken the current authToken to use for the request
-     * @return a parser for the indicated feed
-     * @throws HttpException if an http error is encountered
-     * @throws ParseException if the response from the server could not be
-     *         parsed
-     */
-    public GDataParser getParserForFeed(Class feedEntryClass, String feedUri, String authToken)
-            throws ParseException, IOException, HttpException {
-        GDataClient gDataClient = getGDataClient();
-        GDataParserFactory gDataParserFactory = getGDataParserFactory();
-        InputStream is = gDataClient.getFeedAsStream(feedUri, authToken);
-        return gDataParserFactory.createParser(feedEntryClass, is);
-    }
-
-    /**
-     * Returns a parser for a List (row-based) feed.
-     * 
-     * @param feedUri the URI of the feed to be fetched and parsed
-     * @param authToken the current authToken to use for the request
-     * @return a parser for the indicated feed
-     * @throws HttpException if an http error is encountered
-     * @throws ParseException if the response from the server could not be
-     *         parsed
-     */
-    public GDataParser getParserForListFeed(String feedUri, String authToken)
-            throws ParseException, IOException, HttpException {
-        return getParserForTypedFeed(ListEntry.class, feedUri, authToken);
-    }
-
-    /**
-     * Returns a parser for a Spreadsheets meta-feed.
-     * 
-     * @param feedUri the URI of the feed to be fetched and parsed
-     * @param authToken the current authToken to use for the request
-     * @return a parser for the indicated feed
-     * @throws HttpException if an http error is encountered
-     * @throws ParseException if the response from the server could not be
-     *         parsed
-     */
-    public GDataParser getParserForSpreadsheetsFeed(String feedUri, String authToken)
-            throws ParseException, IOException, HttpException {
-        return getParserForTypedFeed(SpreadsheetEntry.class, feedUri, authToken);
-    }
-
-    /**
-     * Returns a parser for a Worksheets meta-feed.
-     * 
-     * @param feedUri the URI of the feed to be fetched and parsed
-     * @param authToken the current authToken to use for the request
-     * @return a parser for the indicated feed
-     * @throws HttpException if an http error is encountered
-     * @throws ParseException if the response from the server could not be
-     *         parsed
-     */
-    public GDataParser getParserForWorksheetsFeed(String feedUri, String authToken)
-            throws ParseException, IOException, HttpException {
-        return getParserForTypedFeed(WorksheetEntry.class, feedUri, authToken);
-    }
-
-    /**
-     * Updates an entry. The URI to be updated is taken from
-     * <code>entry</code>. Note that only entries in List and Cells feeds
-     * can be updated, so <code>entry</code> must be of the corresponding
-     * type; other types will result in an exception.
-     * 
-     * @param entry the entry to be updated; must include its URI
-     * @param authToken the current authToken to be used for the operation
-     * @return An Entry containing the re-parsed version of the entry returned
-     *         by the server in response to the update.
-     * @throws HttpException if an http error is encountered
-     * @throws ParseException if the server returned an error, if the server's
-     *         response was unparseable (unlikely), or if <code>entry</code>
-     *         is of a read-only type
-     * @throws IOException on network error
-     */
-    public Entry updateEntry(Entry entry, String authToken)
-            throws ParseException, IOException, HttpException {
-        GDataParserFactory factory = getGDataParserFactory();
-        GDataSerializer serializer = factory.createSerializer(entry);
-
-        String editUri = entry.getEditUri();
-        if (StringUtils.isEmpty(editUri)) {
-            throw new ParseException("No edit URI -- cannot update.");
-        }
-
-        InputStream is = getGDataClient().updateEntry(editUri, authToken, serializer);
-        GDataParser parser = factory.createParser(entry.getClass(), is);
-        try {
-            return parser.parseStandaloneEntry();
-        } finally {
-            parser.close();
-        }
-    }
-
-    public String getBaseFeedUrl() {
-        return baseFeedUrl;
-    }  
-}
diff --git a/src/com/google/wireless/gdata2/spreadsheets/client/package.html b/src/com/google/wireless/gdata2/spreadsheets/client/package.html
deleted file mode 100644
index 1c9bf9d..0000000
--- a/src/com/google/wireless/gdata2/spreadsheets/client/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-    {@hide}
-</body>
-</html>
diff --git a/src/com/google/wireless/gdata2/spreadsheets/data/CellEntry.java b/src/com/google/wireless/gdata2/spreadsheets/data/CellEntry.java
deleted file mode 100755
index 82f8910..0000000
--- a/src/com/google/wireless/gdata2/spreadsheets/data/CellEntry.java
+++ /dev/null
@@ -1,134 +0,0 @@
-// Copyright 2007 The Android Open Source Project
-package com.google.wireless.gdata2.spreadsheets.data;
-
-import com.google.wireless.gdata2.data.Entry;
-
-/**
- * Represents an entry in a GData Spreadsheets Cell-based feed.
- */
-public class CellEntry extends Entry {
-    /** The spreadsheet column of the cell. */
-    private int col = -1;
-
-    /** The cell entry's inputValue attribute */
-    private String inputValue = null;
-
-    /** The cell entry's numericValue attribute */
-    private String numericValue = null;
-
-    /** The spreadsheet row of the cell */
-    private int row = -1;
-
-    /** The cell entry's text sub-element */
-    private String value = null;
-
-    /** Default constructor. */
-    public CellEntry() {
-        super();
-    }
-    
-    /**
-     * Fetches the cell's spreadsheet column.
-     * 
-     * @return the cell's spreadsheet column
-     */
-    public int getCol() {
-        return col;
-    }
-
-    /**
-     * Fetches the cell's inputValue attribute, which is the actual user input
-     * rather (such as a formula) than computed value of the cell.
-     * 
-     * @return the cell's inputValue
-     */
-    public String getInputValue() {
-        return inputValue;
-    }
-
-    /**
-     * Fetches the cell's numericValue attribute, which is a decimal
-     * representation.
-     * 
-     * @return the cell's numericValue
-     */
-    public String getNumericValue() {
-        return numericValue;
-    }
-
-    /**
-     * Fetches the cell's spreadsheet row.
-     * 
-     * @return the cell's spreadsheet row
-     */
-    public int getRow() {
-        return row;
-    }
-
-    /**
-     * Fetches the cell's contents, after any computation. For example, if the
-     * cell actually contains a formula, this will return the formula's computed
-     * value.
-     * 
-     * @return the computed value of the cell
-     */
-    public String getValue() {
-        return value;
-    }
-
-    /**
-     * Indicates whether the cell's contents are numeric.
-     * 
-     * @return true if the contents are numeric, or false if not
-     */
-    public boolean hasNumericValue() {
-        return numericValue != null;
-    }
-
-    /**
-     * Sets the cell's spreadsheet column.
-     * 
-     * @param col the new spreadsheet column of the cell
-     */
-    public void setCol(int col) {
-        this.col = col;
-    }
-
-    /**
-     * Sets the cell's actual contents (such as a formula, or a raw value.)
-     * 
-     * @param inputValue the new inputValue of the cell
-     */
-    public void setInputValue(String inputValue) {
-        this.inputValue = inputValue;
-    }
-
-    /**
-     * Sets the cell's numeric value. This can be different from the actual
-     * value; for instance, the actual value may be a thousands-delimited pretty
-     * string, while the numeric value could be the raw decimal.
-     * 
-     * @param numericValue the cell's new numericValue
-     */
-    public void setNumericValue(String numericValue) {
-        this.numericValue = numericValue;
-    }
-
-    /**
-     * Sets the cell's spreadsheet row.
-     * 
-     * @param row the new spreadsheet row of the cell
-     */
-    public void setRow(int row) {
-        this.row = row;
-    }
-
-    /**
-     * Sets the cell's computed value.
-     * 
-     * @param value the new value of the cell
-     */
-    public void setValue(String value) {
-        this.value = value;
-    }
-}
diff --git a/src/com/google/wireless/gdata2/spreadsheets/data/CellFeed.java b/src/com/google/wireless/gdata2/spreadsheets/data/CellFeed.java
deleted file mode 100755
index 19d6ad9..0000000
--- a/src/com/google/wireless/gdata2/spreadsheets/data/CellFeed.java
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2007 The Android Open Source Project
-package com.google.wireless.gdata2.spreadsheets.data;
-
-import com.google.wireless.gdata2.data.Feed;
-
-/**
- * A feed handler for GData Spreadsheets cell-based feeds.
- */
-public class CellFeed extends Feed {
-    private String editUri;
-
-    /** Default constructor. */
-    public CellFeed() {
-        super();
-    }
-
-    /**
-     * Fetches the URI to which edits (such as cell content updates) should
-     * go.
-     * 
-     * @return the edit URI for this feed
-     */
-    public String getEditUri() {
-        return editUri;
-    }
-
-    /**
-     * Sets the URI to which edits (such as cell content updates) should go.
-     * 
-     * @param editUri the new edit URI for this feed
-     */
-    public void setEditUri(String editUri) {
-        this.editUri = editUri;
-    }
-}
diff --git a/src/com/google/wireless/gdata2/spreadsheets/data/ListEntry.java b/src/com/google/wireless/gdata2/spreadsheets/data/ListEntry.java
deleted file mode 100755
index 570bd18..0000000
--- a/src/com/google/wireless/gdata2/spreadsheets/data/ListEntry.java
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright 2007 The Android Open Source Project
-package com.google.wireless.gdata2.spreadsheets.data;
-
-import com.google.wireless.gdata2.data.Entry;
-import com.google.wireless.gdata2.data.StringUtils;
-
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.util.Vector;
-
-/**
- * Represents an entry in a GData Spreadsheets List feed.
- */
-public class ListEntry extends Entry {
-    /** Map containing the values in the row. */
-    private Hashtable values = new Hashtable();
-    
-    /** Caches the list of names, so they don't need to be recomputed. */
-    private Vector names = null;
-
-    /**
-     * Retrieves the column names present in this row.
-     * 
-     * @return a Set of Strings, one per column where data exists
-     */
-    public Vector getNames() {
-        if (names != null) {
-            return names;
-        }
-        names = new Vector();
-        Enumeration e = values.keys();
-        while (e.hasMoreElements()) {
-            names.add(e.nextElement());
-        }
-        return names;
-    }
-
-    /**
-     * Fetches the value for a column. Equivalent to
-     * <code>getValue(name, null)</code>.
-     * 
-     * @param name the name of the column whose row is to be fetched
-     * @return the value of the column, or null if the column is not present
-     */
-    public String getValue(String name) {
-        return getValue(name, null);
-    }
-
-    /**
-     * Fetches the value for a column.
-     * 
-     * @param name the name of the column whose row is to be fetched
-     * @param defaultValue the value to return if the row has no value for the
-     *        requested column; may be null
-     * @return the value of the column, or null if the column is not present
-     */
-    public String getValue(String name, String defaultValue) {
-        if (StringUtils.isEmpty(name)) {
-            return defaultValue;
-        }
-        String val = (String) values.get(name);
-        if (val == null) {
-            return defaultValue;
-        }
-        return val;
-    }
-
-    /**
-     * Sets the value of a column.
-     * 
-     * @param name the name of the column
-     * @param value the value for the column
-     */
-    public void setValue(String name, String value) {
-        values.put(name, value == null ? "" : value);
-    }
-}
diff --git a/src/com/google/wireless/gdata2/spreadsheets/data/ListFeed.java b/src/com/google/wireless/gdata2/spreadsheets/data/ListFeed.java
deleted file mode 100755
index 2fcc0a9..0000000
--- a/src/com/google/wireless/gdata2/spreadsheets/data/ListFeed.java
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2007 The Android Open Source Project
-package com.google.wireless.gdata2.spreadsheets.data;
-
-import com.google.wireless.gdata2.data.Feed;
-
-/**
- * A feed handler for GData Spreadsheets List-based feeds.
- */
-public class ListFeed extends Feed {
-    private String editUri;
-
-    /** Default constructor. */
-    public ListFeed() {
-        super();
-    }
-
-    /**
-     * Fetches the URI to which edits (such as cell content updates) should
-     * go.
-     * 
-     * @return the edit URI for this feed
-     */
-    public String getEditUri() {
-        return editUri;
-    }
-
-    /**
-     * Sets the URI to which edits (such as cell content updates) should go.
-     * 
-     * @param editUri the new edit URI for this feed
-     */
-    public void setEditUri(String editUri) {
-        this.editUri = editUri;
-    }
-}
diff --git a/src/com/google/wireless/gdata2/spreadsheets/data/SpreadsheetEntry.java b/src/com/google/wireless/gdata2/spreadsheets/data/SpreadsheetEntry.java
deleted file mode 100755
index 74c5344..0000000
--- a/src/com/google/wireless/gdata2/spreadsheets/data/SpreadsheetEntry.java
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2007 The Android Open Source Project
-package com.google.wireless.gdata2.spreadsheets.data;
-
-import com.google.wireless.gdata2.GDataException;
-import com.google.wireless.gdata2.data.Entry;
-import com.google.wireless.gdata2.data.StringUtils;
-
-/**
- * Represents an entry in a GData Spreadsheets meta-feed.
- */
-public class SpreadsheetEntry extends Entry {
-    /** The URI of the worksheets meta-feed for this spreadsheet */
-    private String worksheetsUri = null;
-
-    /**
-     * Fetches the URI of the worksheets meta-feed (that is, list of worksheets)
-     * for this spreadsheet.
-     * 
-     * @return the worksheets meta-feed URI
-     * @throws GDataException if the unique key is not set
-     */
-    public String getWorksheetFeedUri() throws GDataException {
-        if (StringUtils.isEmpty(worksheetsUri)) {
-            throw new GDataException("worksheet URI is not set");
-        }
-        return worksheetsUri;
-    }
-
-    /**
-     * Sets the URI of the worksheet meta-feed corresponding to this
-     * spreadsheet.
-     * 
-     * @param href
-     */
-    public void setWorksheetFeedUri(String href) {
-        worksheetsUri = href;
-    }
-}
diff --git a/src/com/google/wireless/gdata2/spreadsheets/data/SpreadsheetFeed.java b/src/com/google/wireless/gdata2/spreadsheets/data/SpreadsheetFeed.java
deleted file mode 100755
index ab2cdbb..0000000
--- a/src/com/google/wireless/gdata2/spreadsheets/data/SpreadsheetFeed.java
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2007 The Android Open Source Project
-package com.google.wireless.gdata2.spreadsheets.data;
-
-import com.google.wireless.gdata2.data.Feed;
-
-/**
- * Feed handler for a GData Spreadsheets meta-feed.
- */
-public class SpreadsheetFeed extends Feed {
-    /** Default constructor. */
-    public SpreadsheetFeed() {
-        super();
-    }
-}
diff --git a/src/com/google/wireless/gdata2/spreadsheets/data/WorksheetEntry.java b/src/com/google/wireless/gdata2/spreadsheets/data/WorksheetEntry.java
deleted file mode 100644
index 9c77221..0000000
--- a/src/com/google/wireless/gdata2/spreadsheets/data/WorksheetEntry.java
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright 2007 The Android Open Source Project
-package com.google.wireless.gdata2.spreadsheets.data;
-
-import com.google.wireless.gdata2.GDataException;
-import com.google.wireless.gdata2.data.Entry;
-import com.google.wireless.gdata2.data.StringUtils;
-
-/**
- * Represents an entry in a GData Worksheets meta-feed.
- */
-public class WorksheetEntry extends Entry {
-    /** The URI to this entry's cells feed. */
-    private String cellsUri = null;
-
-    /** The number of columns in the worksheet. */
-    private int colCount = -1;
-
-    /** The URI to this entry's list feed. */
-    private String listUri = null;
-
-    /** The number of rows in the worksheet. */
-    private int rowCount = -1;
-
-    /**
-     * Fetches the URI of this entry's Cells feed.
-     * 
-     * @return The URI of the entry's Cells feed.
-     */
-    public String getCellFeedUri() {
-        return cellsUri;
-    }
-
-    /**
-     * Fetches the number of columns in the worksheet.
-     * 
-     * @return The number of columns.
-     */
-    public int getColCount() {
-        return colCount;
-    }
-
-    /**
-     * Fetches the URI of this entry's List feed.
-     * 
-     * @return The URI of the entry's List feed.
-     * @throws GDataException If the URI is not set or is invalid.
-     */
-    public String getListFeedUri() {
-        return listUri;
-    }
-
-    /**
-     * Fetches the number of rows in the worksheet.
-     * 
-     * @return The number of rows.
-     */
-    public int getRowCount() {
-        return rowCount;
-    }
-
-    /**
-     * Sets the URI of this entry's Cells feed.
-     * 
-     * @param href The HREF attribute that should be the Cells feed URI.
-     */
-    public void setCellFeedUri(String href) {
-        cellsUri = href;
-    }
-
-    /**
-     * Sets the number of columns in the worksheet.
-     * 
-     * @param colCount The new number of columns.
-     */
-    public void setColCount(int colCount) {
-        this.colCount = colCount;
-    }
-
-    /**
-     * Sets this entry's Atom ID.
-     * 
-     * @param id The new ID value.
-     */
-    public void setId(String id) {
-        super.setId(id);
-    }
-
-    /**
-     * Sets the URI of this entry's List feed.
-     * 
-     * @param href The HREF attribute that should be the List feed URI.
-     */
-    public void setListFeedUri(String href) {
-        listUri = href;
-    }
-
-    /**
-     * Sets the number of rows in the worksheet.
-     * 
-     * @param rowCount The new number of rows.
-     */
-    public void setRowCount(int rowCount) {
-        this.rowCount = rowCount;
-    }
-}
diff --git a/src/com/google/wireless/gdata2/spreadsheets/data/WorksheetFeed.java b/src/com/google/wireless/gdata2/spreadsheets/data/WorksheetFeed.java
deleted file mode 100755
index 000655b..0000000
--- a/src/com/google/wireless/gdata2/spreadsheets/data/WorksheetFeed.java
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2007 The Android Open Source Project
-package com.google.wireless.gdata2.spreadsheets.data;
-
-import com.google.wireless.gdata2.data.Feed;
-
-/**
- * Feed handler for GData Spreadsheets Worksheet meta-feed.
- */
-public class WorksheetFeed extends Feed {
-    /** Default constructor. */
-    public WorksheetFeed() {
-        super();
-    }
-}
diff --git a/src/com/google/wireless/gdata2/spreadsheets/data/package.html b/src/com/google/wireless/gdata2/spreadsheets/data/package.html
deleted file mode 100644
index 1c9bf9d..0000000
--- a/src/com/google/wireless/gdata2/spreadsheets/data/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-    {@hide}
-</body>
-</html>
diff --git a/src/com/google/wireless/gdata2/spreadsheets/package.html b/src/com/google/wireless/gdata2/spreadsheets/package.html
deleted file mode 100644
index 1c9bf9d..0000000
--- a/src/com/google/wireless/gdata2/spreadsheets/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-    {@hide}
-</body>
-</html>
diff --git a/src/com/google/wireless/gdata2/spreadsheets/parser/package.html b/src/com/google/wireless/gdata2/spreadsheets/parser/package.html
deleted file mode 100644
index 1c9bf9d..0000000
--- a/src/com/google/wireless/gdata2/spreadsheets/parser/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-    {@hide}
-</body>
-</html>
diff --git a/src/com/google/wireless/gdata2/spreadsheets/parser/xml/XmlCellsGDataParser.java b/src/com/google/wireless/gdata2/spreadsheets/parser/xml/XmlCellsGDataParser.java
deleted file mode 100755
index 043fe5b..0000000
--- a/src/com/google/wireless/gdata2/spreadsheets/parser/xml/XmlCellsGDataParser.java
+++ /dev/null
@@ -1,126 +0,0 @@
-// Copyright 2007 The Android Open Source Project
-package com.google.wireless.gdata2.spreadsheets.parser.xml;
-
-import com.google.wireless.gdata2.data.Entry;
-import com.google.wireless.gdata2.data.Feed;
-import com.google.wireless.gdata2.data.StringUtils;
-import com.google.wireless.gdata2.data.XmlUtils;
-import com.google.wireless.gdata2.parser.ParseException;
-import com.google.wireless.gdata2.parser.xml.XmlGDataParser;
-import com.google.wireless.gdata2.spreadsheets.data.CellEntry;
-import com.google.wireless.gdata2.spreadsheets.data.CellFeed;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * Parser for non-Atom data in a GData Spreadsheets Cell-based feed.
- */
-public class XmlCellsGDataParser extends XmlGDataParser {
-    /**
-     * The rel ID used by the server to identify the URLs for Cell POSTs
-     * (updates)
-     */
-    private static final String CELL_FEED_POST_REL =
-            "http://schemas.google.com/g/2005#post";
-
-    /**
-     * Creates a new XmlCellsGDataParser.
-     * 
-     * @param is the stream from which to read the data
-     * @param xmlParser the XMLPullParser to use for parsing the raw XML
-     * @throws ParseException if the super-class throws one
-     */
-    public XmlCellsGDataParser(InputStream is, XmlPullParser xmlParser)
-            throws ParseException {
-        super(is, xmlParser);
-    }
-
-    /* (non-JavaDoc)
-     * Creates a new Entry that can handle the data parsed by this class.
-     */
-    protected Entry createEntry() {
-        return new CellEntry();
-    }
-
-    /* (non-JavaDoc)
-     * Creates a new Feed that can handle the data parsed by this class.
-     */
-    protected Feed createFeed() {
-        return new CellFeed();
-    }
-
-    /* (non-JavaDoc)
-     * Callback to handle non-Atom data present in an Atom entry tag.
-     */
-    protected void handleExtraElementInEntry(Entry entry)
-            throws XmlPullParserException, IOException {
-        XmlPullParser parser = getParser();
-        if (!(entry instanceof CellEntry)) {
-            throw new IllegalArgumentException("Expected CellEntry!");
-        }
-        CellEntry row = (CellEntry) entry;
-
-        String name = parser.getName();
-        // cells can only have row, col, inputValue, & numericValue attrs
-        if ("cell".equals(name)) {
-            int count = parser.getAttributeCount();
-            String attrName = null;
-            for (int i = 0; i < count; ++i) {
-                attrName = parser.getAttributeName(i);
-                if ("row".equals(attrName)) {
-                    row.setRow(StringUtils.parseInt(parser
-                            .getAttributeValue(i), 0));
-                } else if ("col".equals(attrName)) {
-                    row.setCol(StringUtils.parseInt(parser
-                            .getAttributeValue(i), 0));
-                } else if ("numericValue".equals(attrName)) {
-                    row.setNumericValue(parser.getAttributeValue(i));
-                } else if ("inputValue".equals(attrName)) {
-                    row.setInputValue(parser.getAttributeValue(i));
-                }
-            }
-
-            // also need the data stored in the child text node
-            row.setValue(XmlUtils.extractChildText(parser));
-        }
-    }
-
-    /* (non-JavaDoc)
-     * Callback to handle non-Atom data in the feed.
-     */
-    protected void handleExtraElementInFeed(Feed feed)
-            throws XmlPullParserException, IOException {
-        XmlPullParser parser = getParser();
-        if (!(feed instanceof CellFeed)) {
-            throw new IllegalArgumentException("Expected CellFeed!");
-        }
-        CellFeed cellFeed = (CellFeed) feed;
-
-        String name = parser.getName();
-        if (!"link".equals(name)) {
-            return;
-        }
-
-        int numAttrs = parser.getAttributeCount();
-        String rel = null;
-        String href = null;
-        String attrName = null;
-        for (int i = 0; i < numAttrs; ++i) {
-            attrName = parser.getAttributeName(i);
-            if ("rel".equals(attrName)) {
-                rel = parser.getAttributeValue(i);
-            } else if ("href".equals(attrName)) {
-                href = parser.getAttributeValue(i);
-            }
-        }
-        if (!(StringUtils.isEmpty(rel) || StringUtils.isEmpty(href))) {
-            if (CELL_FEED_POST_REL.equals(rel)) {
-                cellFeed.setEditUri(href);
-            }
-        }
-    }
-}
diff --git a/src/com/google/wireless/gdata2/spreadsheets/parser/xml/XmlListGDataParser.java b/src/com/google/wireless/gdata2/spreadsheets/parser/xml/XmlListGDataParser.java
deleted file mode 100755
index 6578a1f..0000000
--- a/src/com/google/wireless/gdata2/spreadsheets/parser/xml/XmlListGDataParser.java
+++ /dev/null
@@ -1,109 +0,0 @@
-// Copyright 2007 The Android Open Source Project
-package com.google.wireless.gdata2.spreadsheets.parser.xml;
-
-import com.google.wireless.gdata2.data.Entry;
-import com.google.wireless.gdata2.data.Feed;
-import com.google.wireless.gdata2.data.StringUtils;
-import com.google.wireless.gdata2.data.XmlUtils;
-import com.google.wireless.gdata2.parser.ParseException;
-import com.google.wireless.gdata2.parser.xml.XmlGDataParser;
-import com.google.wireless.gdata2.spreadsheets.data.ListEntry;
-import com.google.wireless.gdata2.spreadsheets.data.ListFeed;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * Parser for non-Atom data in a GData Spreadsheets List-based feed.
- */
-public class XmlListGDataParser extends XmlGDataParser {
-    /**
-     * The rel ID used by the server to identify the URLs for List POSTs
-     * (updates)
-     */
-    private static final String LIST_FEED_POST_REL =
-            "http://schemas.google.com/g/2005#post";
-
-    /**
-     * Creates a new XmlListGDataParser.
-     * 
-     * @param is the stream from which to read the data
-     * @param xmlParser the XmlPullParser to use to parse the raw XML
-     * @throws ParseException if the super-class throws one
-     */
-    public XmlListGDataParser(InputStream is, XmlPullParser xmlParser)
-            throws ParseException {
-        super(is, xmlParser);
-    }
-
-    /* (non-JavaDoc)
-     * Creates a new Entry that can handle the data parsed by this class.
-     */
-    protected Entry createEntry() {
-        return new ListEntry();
-    }
-
-    /* (non-JavaDoc)
-     * Creates a new Feed that can handle the data parsed by this class.
-     */
-    protected Feed createFeed() {
-        return new ListFeed();
-    }
-
-    /* (non-JavaDoc)
-     * Callback to handle non-Atom data present in an Atom entry tag.
-     */
-    protected void handleExtraElementInEntry(Entry entry)
-            throws XmlPullParserException, IOException {
-        XmlPullParser parser = getParser();
-        if (!(entry instanceof ListEntry)) {
-            throw new IllegalArgumentException("Expected ListEntry!");
-        }
-        ListEntry row = (ListEntry) entry;
-
-        String name = parser.getName();
-        row.setValue(name, XmlUtils.extractChildText(parser));
-    }
-
-    /* (non-JavaDoc)
-     * Callback to handle non-Atom data in the feed.
-     */
-    protected void handleExtraElementInFeed(Feed feed)
-            throws XmlPullParserException, IOException {
-        XmlPullParser parser = getParser();
-        if (!(feed instanceof ListFeed)) {
-            throw new IllegalArgumentException("Expected ListFeed!");
-        }
-        ListFeed listFeed = (ListFeed) feed;
-
-        String name = parser.getName();
-        if (!"link".equals(name)) {
-            return;
-        }
-
-        // lists store column data in the gsx namespace:
-        // <gsx:columnheader>data</gsx:columnheader>
-        // The columnheader tag names are the scrubbed values of the first row.
-        // We extract them all and store them as keys in a Map.
-        int numAttrs = parser.getAttributeCount();
-        String rel = null;
-        String href = null;
-        String attrName = null;
-        for (int i = 0; i < numAttrs; ++i) {
-            attrName = parser.getAttributeName(i);
-            if ("rel".equals(attrName)) {
-                rel = parser.getAttributeValue(i);
-            } else if ("href".equals(attrName)) {
-                href = parser.getAttributeValue(i);
-            }
-        }
-        if (!(StringUtils.isEmpty(rel) || StringUtils.isEmpty(href))) {
-            if (LIST_FEED_POST_REL.equals(rel)) {
-                listFeed.setEditUri(href);
-            }
-        }
-    }
-}
diff --git a/src/com/google/wireless/gdata2/spreadsheets/parser/xml/XmlSpreadsheetsGDataParser.java b/src/com/google/wireless/gdata2/spreadsheets/parser/xml/XmlSpreadsheetsGDataParser.java
deleted file mode 100755
index 596e624..0000000
--- a/src/com/google/wireless/gdata2/spreadsheets/parser/xml/XmlSpreadsheetsGDataParser.java
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright 2007 The Android Open Source Project
-package com.google.wireless.gdata2.spreadsheets.parser.xml;
-
-import com.google.wireless.gdata2.data.Entry;
-import com.google.wireless.gdata2.data.Feed;
-import com.google.wireless.gdata2.parser.ParseException;
-import com.google.wireless.gdata2.parser.xml.XmlGDataParser;
-import com.google.wireless.gdata2.spreadsheets.data.SpreadsheetEntry;
-import com.google.wireless.gdata2.spreadsheets.data.SpreadsheetFeed;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * Parser helper for non-Atom data in a GData Spreadsheets meta-feed.
- */
-public class XmlSpreadsheetsGDataParser extends XmlGDataParser {
-    /**
-     * The rel ID used by the server to identify the URLs for the worksheets
-     * feed
-     */
-    protected static final String WORKSHEET_FEED_REL =
-            "http://schemas.google.com/spreadsheets/2006#worksheetsfeed";
-
-    /**
-     * Creates a new XmlSpreadsheetsGDataParser.
-     * 
-     * @param is the stream from which to read the data
-     * @param xmlParser the XmlPullParser to use to parse the raw XML
-     * @throws ParseException if the super-class throws one
-     */
-    public XmlSpreadsheetsGDataParser(InputStream is, XmlPullParser xmlParser)
-            throws ParseException {
-        super(is, xmlParser);
-    }
-
-    /* (non-JavaDoc)
-     * Creates a new Entry that can handle the data parsed by this class.
-     */
-    protected Entry createEntry() {
-        return new SpreadsheetEntry();
-    }
-
-    /* (non-JavaDoc)
-     * Creates a new Feed that can handle the data parsed by this class.
-     */
-    protected Feed createFeed() {
-        return new SpreadsheetFeed();
-    }
-
-    /* (non-JavaDoc)
-     * Callback to handle link elements that are not recognized as Atom links.
-     * Used to pick out the link tag in a Spreadsheet's entry that corresponds
-     * to that spreadsheet's worksheets meta-feed.
-     */
-    protected void handleExtraLinkInEntry(String rel, String type, String href,
-            Entry entry) throws XmlPullParserException, IOException {
-        super.handleExtraLinkInEntry(rel, type, href, entry);
-        if (WORKSHEET_FEED_REL.equals(rel)
-                && "application/atom+xml".equals(type)) {
-            SpreadsheetEntry sheet = (SpreadsheetEntry) entry;
-            sheet.setWorksheetFeedUri(href);
-        }
-    }
-}
diff --git a/src/com/google/wireless/gdata2/spreadsheets/parser/xml/XmlSpreadsheetsGDataParserFactory.java b/src/com/google/wireless/gdata2/spreadsheets/parser/xml/XmlSpreadsheetsGDataParserFactory.java
deleted file mode 100644
index 8aaf300..0000000
--- a/src/com/google/wireless/gdata2/spreadsheets/parser/xml/XmlSpreadsheetsGDataParserFactory.java
+++ /dev/null
@@ -1,99 +0,0 @@
-// Copyright 2007 The Android Open Source Project
-package com.google.wireless.gdata2.spreadsheets.parser.xml;
-
-import com.google.wireless.gdata2.client.GDataParserFactory;
-import com.google.wireless.gdata2.data.Entry;
-import com.google.wireless.gdata2.parser.GDataParser;
-import com.google.wireless.gdata2.parser.ParseException;
-import com.google.wireless.gdata2.parser.xml.XmlParserFactory;
-import com.google.wireless.gdata2.serializer.GDataSerializer;
-import com.google.wireless.gdata2.spreadsheets.data.CellEntry;
-import com.google.wireless.gdata2.spreadsheets.data.ListEntry;
-import com.google.wireless.gdata2.spreadsheets.data.SpreadsheetEntry;
-import com.google.wireless.gdata2.spreadsheets.data.WorksheetEntry;
-import com.google.wireless.gdata2.spreadsheets.serializer.xml.XmlCellEntryGDataSerializer;
-import com.google.wireless.gdata2.spreadsheets.serializer.xml.XmlListEntryGDataSerializer;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.InputStream;
-
-/**
- * A GDataParserFactory capable of handling Spreadsheets.
- */
-public class XmlSpreadsheetsGDataParserFactory implements GDataParserFactory {
-    /*
-     * @see GDataParserFactory
-     */
-    public XmlSpreadsheetsGDataParserFactory(XmlParserFactory xmlFactory) {
-        this.xmlFactory = xmlFactory;
-    }
-
-    /** Intentionally private. */
-    private XmlSpreadsheetsGDataParserFactory() {
-    }
-
-    /*
-     * Creates a parser for the indicated feed, assuming the default feed type.
-     * The default type is specified on {@link SpreadsheetsClient#DEFAULT_FEED}.
-     * 
-     * @param is The stream containing the feed to be parsed.
-     * @return A GDataParser capable of parsing the feed as the default type.
-     * @throws ParseException if the feed could not be parsed for any reason
-     */
-    public GDataParser createParser(InputStream is) throws ParseException {
-        // attempt a default
-        return createParser(SpreadsheetEntry.class, is);
-    }
-
-    /*
-     * Creates a parser of the indicated type for the indicated feed.
-     * 
-     * @param feedType The type of the feed; must be one of the constants on
-     *        {@link SpreadsheetsClient}.
-     * @return A parser capable of parsing the feed as the indicated type.
-     * @throws ParseException if the feed could not be parsed for any reason
-     */
-    public GDataParser createParser(Class entryClass, InputStream is)
-            throws ParseException {
-        try {
-            XmlPullParser xmlParser = xmlFactory.createParser();
-            if (entryClass == SpreadsheetEntry.class) {
-                return new XmlSpreadsheetsGDataParser(is, xmlParser);
-            } else if (entryClass == WorksheetEntry.class) {
-                return new XmlWorksheetsGDataParser(is, xmlParser);
-            } else if (entryClass == CellEntry.class) {
-                return new XmlCellsGDataParser(is, xmlParser);
-            } else if (entryClass == ListEntry.class) {
-                return new XmlListGDataParser(is, xmlParser);
-            } else {
-                throw new ParseException("Unrecognized feed requested.");
-            }
-        } catch (XmlPullParserException e) {
-            throw new ParseException("Failed to create parser", e);
-        }
-    }
-
-    /*
-     * Creates a serializer capable of handling the indicated entry.
-     * 
-     * @param The Entry to be serialized to an XML string.
-     * @return A GDataSerializer capable of handling the indicated entry.
-     * @throws IllegalArgumentException if Entry is not a supported type (which
-     *         currently includes only {@link ListEntry} and {@link CellEntry}.)
-     */
-    public GDataSerializer createSerializer(Entry entry) {
-        if (entry instanceof ListEntry) {
-            return new XmlListEntryGDataSerializer(xmlFactory, entry);
-        } else if (entry instanceof CellEntry) {
-            return new XmlCellEntryGDataSerializer(xmlFactory, entry);
-        } else {
-            throw new IllegalArgumentException(
-                    "Expected a ListEntry or CellEntry");
-        }
-    }
-
-    /** The XmlParserFactory to use to actually process XML streams. */
-    private XmlParserFactory xmlFactory;
-}
diff --git a/src/com/google/wireless/gdata2/spreadsheets/parser/xml/XmlWorksheetsGDataParser.java b/src/com/google/wireless/gdata2/spreadsheets/parser/xml/XmlWorksheetsGDataParser.java
deleted file mode 100755
index 9007b6b..0000000
--- a/src/com/google/wireless/gdata2/spreadsheets/parser/xml/XmlWorksheetsGDataParser.java
+++ /dev/null
@@ -1,98 +0,0 @@
-// Copyright 2007 The Android Open Source Project
-package com.google.wireless.gdata2.spreadsheets.parser.xml;
-
-import com.google.wireless.gdata2.data.Entry;
-import com.google.wireless.gdata2.data.Feed;
-import com.google.wireless.gdata2.data.StringUtils;
-import com.google.wireless.gdata2.data.XmlUtils;
-import com.google.wireless.gdata2.parser.ParseException;
-import com.google.wireless.gdata2.parser.xml.XmlGDataParser;
-import com.google.wireless.gdata2.spreadsheets.data.WorksheetEntry;
-import com.google.wireless.gdata2.spreadsheets.data.WorksheetFeed;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * Parser helper for non-Atom data in a GData Spreadsheets Worksheets meta-feed.
- */
-public class XmlWorksheetsGDataParser extends XmlGDataParser {
-    /**
-     * The rel ID used by the server to identify the cells feed for a worksheet
-     */
-    protected static final String CELLS_FEED_REL =
-            "http://schemas.google.com/spreadsheets/2006#cellsfeed";
-
-    /**
-     * The rel ID used by the server to identify the list feed for a worksheet
-     */
-    protected static final String LIST_FEED_REL =
-            "http://schemas.google.com/spreadsheets/2006#listfeed";
-
-    /**
-     * Creates a new XmlWorksheetsGDataParser.
-     * 
-     * @param is the stream from which to read the data
-     * @param xmlParser the XmlPullParser to use to parse the raw XML
-     * @throws ParseException if the super-class throws one
-     */
-    public XmlWorksheetsGDataParser(InputStream is, XmlPullParser xmlParser)
-            throws ParseException {
-        super(is, xmlParser);
-    }
-
-    /* (non-JavaDoc)
-     * Creates a new Entry that can handle the data parsed by this class.
-     */
-    protected Entry createEntry() {
-        return new WorksheetEntry();
-    }
-
-    /* (non-JavaDoc)
-     * Creates a new Feed that can handle the data parsed by this class.
-     */
-    protected Feed createFeed() {
-        return new WorksheetFeed();
-    }
-
-    /* (non-JavaDoc)
-     * Callback to handle non-Atom data present in an Atom entry tag.
-     */
-    protected void handleExtraElementInEntry(Entry entry)
-            throws XmlPullParserException, IOException {
-        XmlPullParser parser = getParser();
-        if (!(entry instanceof WorksheetEntry)) {
-            throw new IllegalArgumentException("Expected WorksheetEntry!");
-        }
-        WorksheetEntry worksheet = (WorksheetEntry) entry;
-
-        // the only custom elements are rowCount and colCount
-        String name = parser.getName();
-        if ("rowCount".equals(name)) {
-            worksheet.setRowCount(StringUtils.parseInt(XmlUtils
-                    .extractChildText(parser), 0));
-        } else if ("colCount".equals(name)) {
-            worksheet.setColCount(StringUtils.parseInt(XmlUtils
-                    .extractChildText(parser), 0));
-        }
-    }
-
-    /* (non-JavaDoc)
-     * Callback to handle non-Atom links present in an Atom entry tag. Used to
-     * pick out a worksheet's cells and list feeds.
-     */
-    protected void handleExtraLinkInEntry(String rel, String type, String href,
-            Entry entry) throws XmlPullParserException, IOException {
-        if (LIST_FEED_REL.equals(rel) && "application/atom+xml".equals(type)) {
-            WorksheetEntry sheet = (WorksheetEntry) entry;
-            sheet.setListFeedUri(href);
-        } else if (CELLS_FEED_REL.equals(rel)
-                && "application/atom+xml".equals(type)) {
-            WorksheetEntry sheet = (WorksheetEntry) entry;
-            sheet.setCellFeedUri(href);
-        }
-    }
-}
diff --git a/src/com/google/wireless/gdata2/spreadsheets/parser/xml/package.html b/src/com/google/wireless/gdata2/spreadsheets/parser/xml/package.html
deleted file mode 100644
index 1c9bf9d..0000000
--- a/src/com/google/wireless/gdata2/spreadsheets/parser/xml/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-    {@hide}
-</body>
-</html>
diff --git a/src/com/google/wireless/gdata2/spreadsheets/serializer/package.html b/src/com/google/wireless/gdata2/spreadsheets/serializer/package.html
deleted file mode 100644
index 1c9bf9d..0000000
--- a/src/com/google/wireless/gdata2/spreadsheets/serializer/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-    {@hide}
-</body>
-</html>
diff --git a/src/com/google/wireless/gdata2/spreadsheets/serializer/xml/XmlCellEntryGDataSerializer.java b/src/com/google/wireless/gdata2/spreadsheets/serializer/xml/XmlCellEntryGDataSerializer.java
deleted file mode 100755
index 9a382c4..0000000
--- a/src/com/google/wireless/gdata2/spreadsheets/serializer/xml/XmlCellEntryGDataSerializer.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package com.google.wireless.gdata2.spreadsheets.serializer.xml;
-
-import com.google.wireless.gdata2.data.Entry;
-import com.google.wireless.gdata2.data.StringUtils;
-import com.google.wireless.gdata2.parser.ParseException;
-import com.google.wireless.gdata2.parser.xml.XmlParserFactory;
-import com.google.wireless.gdata2.serializer.xml.XmlEntryGDataSerializer;
-import com.google.wireless.gdata2.spreadsheets.data.CellEntry;
-
-import org.xmlpull.v1.XmlSerializer;
-
-import java.io.IOException;
-
-/**
- * A serializer for handling GData Spreadsheets Cell entries.
- */
-public class XmlCellEntryGDataSerializer extends XmlEntryGDataSerializer {
-    /** The namespace to use for the GData Cell attributes */
-    public static final String NAMESPACE_GS = "gs";
-
-    /** The URI of the GData Cell namespace */
-    public static final String NAMESPACE_GS_URI =
-            "http://schemas.google.com/spreadsheets/2006";
-
-    /**
-     * Creates a new XmlCellEntryGDataSerializer.
-     * 
-     * @param entry the entry to be serialized
-     */
-    public XmlCellEntryGDataSerializer(XmlParserFactory xmlFactory,
-            Entry entry) {
-        super(xmlFactory, entry);
-    }
-
-    /**
-     * Sets up the GData Cell namespace.
-     * 
-     * @param serializer the serializer to use
-     */
-    protected void declareExtraEntryNamespaces(XmlSerializer serializer)
-            throws IOException {
-        serializer.setPrefix(NAMESPACE_GS, NAMESPACE_GS_URI);
-    }
-
-    /*
-     * Handles the non-Atom data belonging to the GData Spreadsheets Cell
-     * namespace.
-     * 
-     * @param serializer the XML serializer to use
-     * @param format unused
-     * @throws ParseException if the data could not be serialized
-     * @throws IOException on network error
-     */
-    protected void serializeExtraEntryContents(XmlSerializer serializer,
-            int format) throws ParseException, IOException {
-        CellEntry entry = (CellEntry) getEntry();
-        int row = entry.getRow();
-        int col = entry.getCol();
-        String value = entry.getValue();
-        String inputValue = entry.getInputValue();
-        if (row < 0 || col < 0) {
-            throw new ParseException("Negative row or column value");
-        }
-
-        // cells require row & col attrs, and allow inputValue and
-        // numericValue
-        serializer.startTag(NAMESPACE_GS_URI, "cell");
-        serializer.attribute(null /* ns */, "row", "" + row);
-        serializer.attribute(null /* ns */, "col", "" + col);
-        if (inputValue != null) {
-            serializer.attribute(null /* ns */, "inputValue", inputValue);
-        }
-        if (entry.hasNumericValue()) {
-            serializer.attribute(null /* ns */, "numericValue", entry
-                    .getNumericValue());
-        }
-
-        // set the child text...
-        value = StringUtils.isEmpty(value) ? "" : value;
-        serializer.text(value);
-        serializer.endTag(NAMESPACE_GS_URI, "cell");
-    }
-}
diff --git a/src/com/google/wireless/gdata2/spreadsheets/serializer/xml/XmlListEntryGDataSerializer.java b/src/com/google/wireless/gdata2/spreadsheets/serializer/xml/XmlListEntryGDataSerializer.java
deleted file mode 100755
index 3f0c439..0000000
--- a/src/com/google/wireless/gdata2/spreadsheets/serializer/xml/XmlListEntryGDataSerializer.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package com.google.wireless.gdata2.spreadsheets.serializer.xml;
-
-import com.google.wireless.gdata2.data.Entry;
-import com.google.wireless.gdata2.parser.ParseException;
-import com.google.wireless.gdata2.parser.xml.XmlParserFactory;
-import com.google.wireless.gdata2.serializer.xml.XmlEntryGDataSerializer;
-import com.google.wireless.gdata2.spreadsheets.data.ListEntry;
-
-import org.xmlpull.v1.XmlSerializer;
-
-import java.io.IOException;
-import java.util.Iterator;
-import java.util.Vector;
-
-/**
- * A serializer for handling GData Spreadsheets List entries.
- */
-public class XmlListEntryGDataSerializer extends XmlEntryGDataSerializer {
-    /** The prefix to use for the GData Spreadsheets list namespace */
-    public static final String NAMESPACE_GSX = "gsx";
-
-    /** The URI of the GData Spreadsheets list namespace */
-    public static final String NAMESPACE_GSX_URI =
-            "http://schemas.google.com/spreadsheets/2006/extended";
-
-    /**
-     * Creates a new XmlListEntryGDataSerializer.
-     * 
-     * @param entry the entry to be serialized
-     */
-    public XmlListEntryGDataSerializer(XmlParserFactory xmlFactory, Entry entry) {
-        super(xmlFactory, entry);
-    }
-
-    /**
-     * Sets up the GData Spreadsheets list namespace.
-     * 
-     * @param serializer the XML serializer to use
-     * @throws IOException on stream errors.
-     */
-    protected void declareExtraEntryNamespaces(XmlSerializer serializer)
-            throws IOException {
-        serializer.setPrefix(NAMESPACE_GSX, NAMESPACE_GSX_URI);
-    }
-
-    /* (non-JavaDoc)
-     * Handles the non-Atom data belonging to the GData Spreadsheets Cell
-     * namespace.
-     */
-    protected void serializeExtraEntryContents(XmlSerializer serializer,
-            int format) throws ParseException, IOException {
-        ListEntry entry = (ListEntry) getEntry();
-        Vector names = entry.getNames();
-        String name = null;
-        String value = null;
-        Iterator it = names.iterator();
-        while (it.hasNext()) {
-            name = (String) it.next();
-            value = entry.getValue(name);
-            if (value != null) {
-                serializer.startTag(NAMESPACE_GSX_URI, name);
-                serializer.text(value);
-                serializer.endTag(NAMESPACE_GSX_URI, name);
-            }
-        }
-    }
-}
diff --git a/src/com/google/wireless/gdata2/spreadsheets/serializer/xml/package.html b/src/com/google/wireless/gdata2/spreadsheets/serializer/xml/package.html
deleted file mode 100644
index 1c9bf9d..0000000
--- a/src/com/google/wireless/gdata2/spreadsheets/serializer/xml/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-    {@hide}
-</body>
-</html>
