diff --git a/Android.mk b/Android.mk
index 8d13e3b..be3f569 100644
--- a/Android.mk
+++ b/Android.mk
@@ -525,7 +525,6 @@
 
 ext_dirs := \
 	../../external/apache-http/src \
-	../../external/gdata/src \
 	../../external/tagsoup/src
 
 ext_src_files := $(call all-java-files-under,$(ext_dirs))
diff --git a/core/java/android/provider/Calendar.java b/core/java/android/provider/Calendar.java
index b8cf6c2..1652ebd 100644
--- a/core/java/android/provider/Calendar.java
+++ b/core/java/android/provider/Calendar.java
@@ -33,17 +33,6 @@
 import android.util.Config;
 import android.util.Log;
 import android.accounts.Account;
-import com.android.internal.database.ArrayListCursor;
-import com.google.android.gdata.client.AndroidGDataClient;
-import com.google.android.gdata.client.AndroidXmlParserFactory;
-import com.google.wireless.gdata.calendar.client.CalendarClient;
-import com.google.wireless.gdata.calendar.data.EventEntry;
-import com.google.wireless.gdata.calendar.data.Who;
-import com.google.wireless.gdata.calendar.parser.xml.XmlCalendarGDataParserFactory;
-import com.google.wireless.gdata.data.StringUtils;
-
-import java.util.ArrayList;
-import java.util.Vector;
 
 /**
  * The Calendar provider contains all calendar events.
@@ -547,8 +536,6 @@
                                AttendeesColumns.ATTENDEE_TYPE,
                                AttendeesColumns.ATTENDEE_STATUS };
 
-        private static CalendarClient sCalendarClient = null;
-
         public static final Cursor query(ContentResolver cr, String[] projection) {
             return cr.query(CONTENT_URI, projection, null, null, DEFAULT_SORT_ORDER);
         }
@@ -600,7 +587,7 @@
 
             // where
             String where = extractValue(event, "LOCATION");
-            if (!StringUtils.isEmpty(where)) {
+            if (!TextUtils.isEmpty(where)) {
                 values.put(EVENT_LOCATION, where);
             }
 
@@ -687,47 +674,6 @@
         }
 
         /**
-         * Returns a singleton instance of the CalendarClient used to fetch entries from the
-         * calendar server.
-         * @param cr The ContentResolver used to lookup the address of the calendar server in the
-         * settings database.
-         * @return The singleton instance of the CalendarClient used to fetch entries from the
-         * calendar server.
-         */
-        private static synchronized CalendarClient getCalendarClient(ContentResolver cr) {
-            if (sCalendarClient == null) {
-                sCalendarClient = new CalendarClient(
-                        new AndroidGDataClient(cr),
-                        new XmlCalendarGDataParserFactory(new AndroidXmlParserFactory()));
-            }
-            return sCalendarClient;
-        }
-
-        /**
-         * Extracts the attendees information out of event and adds it to a new ArrayList of columns
-         * within the supplied ArrayList of rows.  These rows are expected to be used within an
-         * {@link ArrayListCursor}.
-         */
-        private static final void extractAttendeesIntoArrayList(EventEntry event,
-                ArrayList<ArrayList> rows) {
-            Log.d(TAG, "EVENT: " + event.toString());
-            Vector<Who> attendees = (Vector<Who>) event.getAttendees();
-
-            int numAttendees = attendees == null ? 0 : attendees.size();
-
-            for (int i = 0; i < numAttendees; ++i) {
-                Who attendee = attendees.elementAt(i);
-                ArrayList row = new ArrayList();
-                row.add(attendee.getValue());
-                row.add(attendee.getEmail());
-                row.add(attendee.getRelationship());
-                row.add(attendee.getType());
-                row.add(attendee.getStatus());
-                rows.add(row);
-            }
-        }
-
-        /**
          * The content:// style URL for this table
          */
         public static final Uri CONTENT_URI =
diff --git a/core/java/com/google/android/gdata/client/AndroidGDataClient.java b/core/java/com/google/android/gdata/client/AndroidGDataClient.java
deleted file mode 100644
index 9a2a51d..0000000
--- a/core/java/com/google/android/gdata/client/AndroidGDataClient.java
+++ /dev/null
@@ -1,508 +0,0 @@
-// Copyright 2007 The Android Open Source Project
-
-package com.google.android.gdata.client;
-
-import com.google.android.net.GoogleHttpClient;
-import com.google.wireless.gdata.client.GDataClient;
-import com.google.wireless.gdata.client.HttpException;
-import com.google.wireless.gdata.client.QueryParams;
-import com.google.wireless.gdata.data.StringUtils;
-import com.google.wireless.gdata.parser.ParseException;
-import com.google.wireless.gdata.serializer.GDataSerializer;
-
-import org.apache.http.Header;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpResponse;
-import org.apache.http.StatusLine;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.client.methods.HttpUriRequest;
-import org.apache.http.entity.InputStreamEntity;
-import org.apache.http.entity.AbstractHttpEntity;
-import org.apache.http.entity.ByteArrayEntity;
-
-import android.content.ContentResolver;
-import android.content.Context;
-import android.net.http.AndroidHttpClient;
-import android.text.TextUtils;
-import android.util.Config;
-import android.util.Log;
-import android.os.SystemProperties;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
-import java.io.BufferedInputStream;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URLEncoder;
-
-/**
- * Implementation of a GDataClient using GoogleHttpClient to make HTTP
- * requests.  Always issues GETs and POSTs, using the X-HTTP-Method-Override
- * header when a PUT or DELETE is desired, to avoid issues with firewalls, etc.,
- * that do not allow methods other than GET or POST.
- */
-public class AndroidGDataClient implements GDataClient {
-
-    private static final String TAG = "GDataClient";
-    private static final boolean DEBUG = false;
-    private static final boolean LOCAL_LOGV = DEBUG ? Config.LOGD : Config.LOGV;
-
-    private static final String X_HTTP_METHOD_OVERRIDE =
-        "X-HTTP-Method-Override";
-
-    private static final String DEFAULT_USER_AGENT_APP_VERSION = "Android-GData/1.1";
-
-    private static final int MAX_REDIRECTS = 10;
-
-    // boolean system property that can be used to control whether or not
-    // requests/responses are gzip'd.
-    private static final String NO_GZIP_SYSTEM_PROPERTY = "sync.nogzip";
-
-    private final GoogleHttpClient mHttpClient;
-    private ContentResolver mResolver;
-
-    /**
-     * Interface for creating HTTP requests.  Used by
-     * {@link AndroidGDataClient#createAndExecuteMethod}, since HttpUriRequest does not allow for
-     * changing the URI after creation, e.g., when you want to follow a redirect.
-     */
-    private interface HttpRequestCreator {
-        HttpUriRequest createRequest(URI uri);
-    }
-
-    private static class GetRequestCreator implements HttpRequestCreator {
-        public GetRequestCreator() {
-        }
-
-        public HttpUriRequest createRequest(URI uri) {
-            HttpGet get = new HttpGet(uri);
-            return get;
-        }
-    }
-
-    private static class PostRequestCreator implements HttpRequestCreator {
-        private final String mMethodOverride;
-        private final HttpEntity mEntity;
-        public PostRequestCreator(String methodOverride, HttpEntity entity) {
-            mMethodOverride = methodOverride;
-            mEntity = entity;
-        }
-
-        public HttpUriRequest createRequest(URI uri) {
-            HttpPost post = new HttpPost(uri);
-            if (mMethodOverride != null) {
-                post.addHeader(X_HTTP_METHOD_OVERRIDE, mMethodOverride);
-            }
-            post.setEntity(mEntity);
-            return post;
-        }
-    }
-
-    // MAJOR TODO: make this work across redirects (if we can reset the InputStream).
-    // OR, read the bits into a local buffer (yuck, the media could be large).
-    private static class MediaPutRequestCreator implements HttpRequestCreator {
-        private final InputStream mMediaInputStream;
-        private final String mContentType;
-        public MediaPutRequestCreator(InputStream mediaInputStream, String contentType) {
-            mMediaInputStream = mediaInputStream;
-            mContentType = contentType;
-        }
-
-        public HttpUriRequest createRequest(URI uri) {
-            HttpPost post = new HttpPost(uri);
-            post.addHeader(X_HTTP_METHOD_OVERRIDE, "PUT");
-            // mMediaInputStream.reset();
-            InputStreamEntity entity = new InputStreamEntity(mMediaInputStream,
-                    -1 /* read until EOF */);
-            entity.setContentType(mContentType);
-            post.setEntity(entity);
-            return post;
-        }
-    }
-
-    /**
-     * @deprecated Use AndroidGDAtaClient(Context) instead.
-     */
-    public AndroidGDataClient(ContentResolver resolver) {
-        mHttpClient = new GoogleHttpClient(resolver, DEFAULT_USER_AGENT_APP_VERSION,
-                true /* gzip capable */);
-        mHttpClient.enableCurlLogging(TAG, Log.VERBOSE);
-        mResolver = resolver;
-    }
-
-    /**
-     * Creates a new AndroidGDataClient.
-     * 
-     * @param context The ContentResolver to get URL rewriting rules from
-     * through the Android proxy server, using null to indicate not using proxy.
-     * The context will also be used by GoogleHttpClient for configuration of 
-     * SSL session persistence.
-     */
-    public AndroidGDataClient(Context context) {
-       this(context, DEFAULT_USER_AGENT_APP_VERSION);
-    }
-
-    /**
-     * Creates a new AndroidGDataClient.
-     *
-     * @param context The ContentResolver to get URL rewriting rules from
-     * through the Android proxy server, using null to indicate not using proxy.
-     * The context will also be used by GoogleHttpClient for configuration of
-     * SSL session persistence.
-     * @param appAndVersion The application name and version to be used as the basis of the
-     * User-Agent.  e.g., Android-GData/1.5.0.
-     */
-    public AndroidGDataClient(Context context, String appAndVersion) {
-        mHttpClient = new GoogleHttpClient(context, appAndVersion,
-                true /* gzip capable */);
-        mHttpClient.enableCurlLogging(TAG, Log.VERBOSE);
-        mResolver = context.getContentResolver();
-    }
-
-    public void close() {
-        mHttpClient.close();
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see GDataClient#encodeUri(java.lang.String)
-     */
-    public String encodeUri(String uri) {
-        String encodedUri;
-        try {
-            encodedUri = URLEncoder.encode(uri, "UTF-8");
-        } catch (UnsupportedEncodingException uee) {
-            // should not happen.
-            Log.e("JakartaGDataClient",
-                  "UTF-8 not supported -- should not happen.  "
-                  + "Using default encoding.", uee);
-            encodedUri = URLEncoder.encode(uri);
-        }
-        return encodedUri;
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see com.google.wireless.gdata.client.GDataClient#createQueryParams()
-     */
-    public QueryParams createQueryParams() {
-        return new QueryParamsImpl();
-    }
-
-    // follows redirects
-    private InputStream createAndExecuteMethod(HttpRequestCreator creator,
-                                               String uriString,
-                                               String authToken)
-        throws HttpException, IOException {
-
-        HttpResponse response = null;
-        int status = 500;
-        int redirectsLeft = MAX_REDIRECTS;
-
-        URI uri;
-        try {
-            uri = new URI(uriString);
-        } catch (URISyntaxException use) {
-            Log.w(TAG, "Unable to parse " + uriString + " as URI.", use);
-            throw new IOException("Unable to parse " + uriString + " as URI: "
-                    + use.getMessage());
-        }
-
-        // we follow redirects ourselves, since we want to follow redirects even on POSTs, which
-        // the HTTP library does not do.  following redirects ourselves also allows us to log
-        // the redirects using our own logging.
-        while (redirectsLeft > 0) {
-
-            HttpUriRequest request = creator.createRequest(uri);
-
-            if (!SystemProperties.getBoolean(NO_GZIP_SYSTEM_PROPERTY, false)) {
-                AndroidHttpClient.modifyRequestToAcceptGzipResponse(request);
-            }
-
-            // only add the auth token if not null (to allow for GData feeds that do not require
-            // authentication.)
-            if (!TextUtils.isEmpty(authToken)) {
-                request.addHeader("Authorization", "GoogleLogin auth=" + authToken);
-            }
-            if (LOCAL_LOGV) {
-                for (Header h : request.getAllHeaders()) {
-                    Log.v(TAG, h.getName() + ": " + h.getValue());
-                }
-            }
-
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                    Log.d(TAG, "Executing " + request.getRequestLine().toString());
-            }
-
-            response = null;
-
-            try {
-                response = mHttpClient.execute(request);
-            } catch (IOException ioe) {
-                Log.w(TAG, "Unable to execute HTTP request." + ioe);
-                throw ioe;
-            }
-
-            StatusLine statusLine = response.getStatusLine();
-            if (statusLine == null) {
-                Log.w(TAG, "StatusLine is null.");
-                throw new NullPointerException("StatusLine is null -- should not happen.");
-            }
-
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, response.getStatusLine().toString());
-                for (Header h : response.getAllHeaders()) {
-                    Log.d(TAG, h.getName() + ": " + h.getValue());
-                }
-            }
-            status = statusLine.getStatusCode();
-
-            HttpEntity entity = response.getEntity();
-
-            if ((status >= 200) && (status < 300) && entity != null) {
-                InputStream in = AndroidHttpClient.getUngzippedContent(entity);
-                if (Log.isLoggable(TAG, Log.DEBUG)) {
-                    in = logInputStreamContents(in);
-                }
-                return in;
-            }
-
-            // TODO: handle 301, 307?
-            // TODO: let the http client handle the redirects, if we can be sure we'll never get a
-            // redirect on POST.
-            if (status == 302) {
-                // consume the content, so the connection can be closed.
-                entity.consumeContent();
-                Header location = response.getFirstHeader("Location");
-                if (location == null) {
-                    if (Log.isLoggable(TAG, Log.DEBUG)) {
-                        Log.d(TAG, "Redirect requested but no Location "
-                                + "specified.");
-                    }
-                    break;
-                }
-                if (Log.isLoggable(TAG, Log.DEBUG)) {
-                    Log.d(TAG, "Following redirect to " + location.getValue());
-                }
-                try {
-                    uri = new URI(location.getValue());
-                } catch (URISyntaxException use) {
-                    if (Log.isLoggable(TAG, Log.DEBUG)) {
-                        Log.d(TAG, "Unable to parse " + location.getValue() + " as URI.", use);
-                        throw new IOException("Unable to parse " + location.getValue()
-                                + " as URI.");
-                    }
-                    break;
-                }
-                --redirectsLeft;
-            } else {
-                break;
-            }
-        }
-
-        if (Log.isLoggable(TAG, Log.VERBOSE)) {
-            Log.v(TAG, "Received " + status + " status code.");
-        }
-        String errorMessage = null;
-        HttpEntity entity = response.getEntity();
-        try {
-            if (response != null && entity != null) {
-                InputStream in = AndroidHttpClient.getUngzippedContent(entity);
-                ByteArrayOutputStream baos = new ByteArrayOutputStream();
-                byte[] buf = new byte[8192];
-                int bytesRead = -1;
-                while ((bytesRead = in.read(buf)) != -1) {
-                    baos.write(buf, 0, bytesRead);
-                }
-                // TODO: use appropriate encoding, picked up from Content-Type.
-                errorMessage = new String(baos.toByteArray());
-                if (Log.isLoggable(TAG, Log.VERBOSE)) {
-                    Log.v(TAG, errorMessage);
-                }
-            }
-        } finally {
-            if (entity != null) {
-                entity.consumeContent();
-            }
-        }
-        String exceptionMessage = "Received " + status + " status code";
-        if (errorMessage != null) {
-            exceptionMessage += (": " + errorMessage);
-        }
-        throw new HttpException(exceptionMessage, status, null /* InputStream */);
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see GDataClient#getFeedAsStream(java.lang.String, java.lang.String)
-     */
-    public InputStream getFeedAsStream(String feedUrl,
-                                       String authToken)
-        throws HttpException, IOException {
-
-        InputStream in = createAndExecuteMethod(new GetRequestCreator(), feedUrl, authToken);
-        if (in != null) {
-            return in;
-        }
-        throw new IOException("Unable to access feed.");
-    }
-
-    /**
-     * Log the contents of the input stream.
-     * The original input stream is consumed, so the caller must use the
-     * BufferedInputStream that is returned.
-     * @param in InputStream
-     * @return replacement input stream for caller to use
-     * @throws IOException
-     */
-    private InputStream logInputStreamContents(InputStream in) throws IOException {
-        if (in == null) {
-            return in;
-        }
-        // bufferSize is the (arbitrary) maximum amount to log.
-        // The original InputStream is wrapped in a
-        // BufferedInputStream with a 16K buffer.  This lets
-        // us read up to 16K, write it to the log, and then
-        // reset the stream so the the original client can
-        // then read the data.  The BufferedInputStream
-        // provides the mark and reset support, even when
-        // the original InputStream does not.
-        final int bufferSize = 16384;
-        BufferedInputStream bin = new BufferedInputStream(in, bufferSize);
-        bin.mark(bufferSize);
-        int wanted = bufferSize;
-        int totalReceived = 0;
-        byte buf[] = new byte[wanted];
-        while (wanted > 0) {
-            int got = bin.read(buf, totalReceived, wanted);
-            if (got <= 0) break; // EOF
-            wanted -= got;
-            totalReceived += got;
-        }
-        Log.d(TAG, new String(buf, 0, totalReceived, "UTF-8"));
-        bin.reset();
-        return bin;
-    }
-
-    public InputStream getMediaEntryAsStream(String mediaEntryUrl, String authToken)
-            throws HttpException, IOException {
-
-        InputStream in = createAndExecuteMethod(new GetRequestCreator(), mediaEntryUrl, authToken);
-
-        if (in != null) {
-            return in;
-        }
-        throw new IOException("Unable to access media entry.");
-    }
-
-    /* (non-Javadoc)
-    * @see GDataClient#createEntry
-    */
-    public InputStream createEntry(String feedUrl,
-                                   String authToken,
-                                   GDataSerializer entry)
-        throws HttpException, IOException {
-
-        HttpEntity entity = createEntityForEntry(entry, GDataSerializer.FORMAT_CREATE);
-        InputStream in = createAndExecuteMethod(
-                new PostRequestCreator(null /* override */, entity),
-                feedUrl,
-                authToken);
-        if (in != null) {
-            return in;
-        }
-        throw new IOException("Unable to create entry.");
-    }
-
-    /* (non-Javadoc)
-     * @see GDataClient#updateEntry
-     */
-    public InputStream updateEntry(String editUri,
-                                   String authToken,
-                                   GDataSerializer entry)
-        throws HttpException, IOException {
-        HttpEntity entity = createEntityForEntry(entry, GDataSerializer.FORMAT_UPDATE);
-        InputStream in = createAndExecuteMethod(
-                new PostRequestCreator("PUT", entity),
-                editUri,
-                authToken);
-        if (in != null) {
-            return in;
-        }
-        throw new IOException("Unable to update entry.");
-    }
-
-    /* (non-Javadoc)
-     * @see GDataClient#deleteEntry
-     */
-    public void deleteEntry(String editUri, String authToken)
-        throws HttpException, IOException {
-        if (StringUtils.isEmpty(editUri)) {
-            throw new IllegalArgumentException(
-                    "you must specify an non-empty edit url");
-        }
-        InputStream in =
-            createAndExecuteMethod(
-                    new PostRequestCreator("DELETE", null /* entity */),
-                    editUri,
-                    authToken);
-        if (in == null) {
-            throw new IOException("Unable to delete entry.");
-        }
-        try {
-            in.close();
-        } catch (IOException ioe) {
-            // ignore
-        }
-    }
-
-    public InputStream updateMediaEntry(String editUri, String authToken,
-            InputStream mediaEntryInputStream, String contentType)
-        throws HttpException, IOException {
-        InputStream in = createAndExecuteMethod(
-                new MediaPutRequestCreator(mediaEntryInputStream, contentType),
-                editUri,
-                authToken);
-        if (in != null) {
-            return in;
-        }
-        throw new IOException("Unable to write media entry.");
-    }
-
-    private HttpEntity createEntityForEntry(GDataSerializer entry, int format) throws IOException {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        try {
-            entry.serialize(baos, format);
-        } catch (IOException ioe) {
-            Log.e(TAG, "Unable to serialize entry.", ioe);
-            throw ioe;
-        } catch (ParseException pe) {
-            Log.e(TAG, "Unable to serialize entry.", pe);
-            throw new IOException("Unable to serialize entry: " + pe.getMessage());
-        }
-
-        byte[] entryBytes = baos.toByteArray();
-
-        if (entryBytes != null && Log.isLoggable(TAG, Log.DEBUG)) {
-            try {
-                Log.d(TAG, "Serialized entry: " + new String(entryBytes, "UTF-8"));
-            } catch (UnsupportedEncodingException uee) {
-                // should not happen
-                throw new IllegalStateException("UTF-8 should be supported!",
-                        uee);
-            }
-        }
-
-        AbstractHttpEntity entity;
-        if (SystemProperties.getBoolean(NO_GZIP_SYSTEM_PROPERTY, false)) {
-            entity = new ByteArrayEntity(entryBytes);
-        } else {
-            entity = AndroidHttpClient.getCompressedEntity(entryBytes, mResolver);
-        }
-        entity.setContentType(entry.getContentType());
-        return entity;
-    }
-}
diff --git a/core/java/com/google/android/gdata/client/AndroidXmlParserFactory.java b/core/java/com/google/android/gdata/client/AndroidXmlParserFactory.java
deleted file mode 100644
index a308fc0..0000000
--- a/core/java/com/google/android/gdata/client/AndroidXmlParserFactory.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package com.google.android.gdata.client;
-
-import com.google.wireless.gdata.parser.xml.XmlParserFactory;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-import org.xmlpull.v1.XmlSerializer;
-
-import android.util.Xml;
-
-/**
- * XmlParserFactory for the Android platform.
- */
-public class AndroidXmlParserFactory implements XmlParserFactory {
-
-    /*
-     * (non-javadoc)
-     * @see XmlParserFactory#createParser
-     */
-    public XmlPullParser createParser() throws XmlPullParserException {
-        return Xml.newPullParser();
-    }
-
-    /*
-     * (non-javadoc)
-     * @see XmlParserFactory#createSerializer
-     */
-    public XmlSerializer createSerializer() throws XmlPullParserException {
-        return Xml.newSerializer();
-    }
-}
diff --git a/core/java/com/google/android/gdata/client/QueryParamsImpl.java b/core/java/com/google/android/gdata/client/QueryParamsImpl.java
deleted file mode 100644
index fbe0d22..0000000
--- a/core/java/com/google/android/gdata/client/QueryParamsImpl.java
+++ /dev/null
@@ -1,102 +0,0 @@
-package com.google.android.gdata.client;
-
-import com.google.wireless.gdata.client.QueryParams;
-
-import android.text.TextUtils;
-import android.util.Log;
-
-import java.io.UnsupportedEncodingException;
-import java.net.URLEncoder;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Simple implementation of the QueryParams interface.
- */
-// TODO: deal with categories
-public class QueryParamsImpl extends QueryParams {
-
-    private final Map<String,String> mParams = new HashMap<String,String>();
-
-    /**
-     * Creates a new empty QueryParamsImpl.
-     */
-    public QueryParamsImpl() {
-    }
-
-    @Override
-    public void clear() {
-        setEntryId(null);
-        mParams.clear();
-    }
-
-    @Override
-    public String generateQueryUrl(String feedUrl) {
-
-        if (TextUtils.isEmpty(getEntryId()) &&
-            mParams.isEmpty()) {
-            // nothing to do
-            return feedUrl;
-        }
-
-        // handle entry IDs
-        if (!TextUtils.isEmpty(getEntryId())) {
-            if (!mParams.isEmpty()) {
-                throw new IllegalStateException("Cannot set both an entry ID "
-                        + "and other query paramters.");
-            }
-            return feedUrl + '/' + getEntryId();
-        }
-
-        // otherwise, append the querystring params.
-        StringBuilder sb = new StringBuilder();
-        sb.append(feedUrl);
-        Set<String> params = mParams.keySet();
-        boolean first = true;
-        if (feedUrl.contains("?")) {
-            first = false;
-        } else {
-            sb.append('?');
-        }
-        for (String param : params) {
-            String value = mParams.get(param);
-            if (value == null) continue;
-            if (first) {
-                first = false;
-            } else {
-                sb.append('&');
-            }
-            sb.append(param);
-            sb.append('=');
-
-            String encodedValue = null;
-
-            try {
-                encodedValue = URLEncoder.encode(value, "UTF-8");
-            } catch (UnsupportedEncodingException uee) {
-                // should not happen.
-                Log.w("QueryParamsImpl",
-                      "UTF-8 not supported -- should not happen.  "
-                      + "Using default encoding.", uee);
-                encodedValue = URLEncoder.encode(value);
-            }
-            sb.append(encodedValue);
-        }
-        return sb.toString();
-    }
-
-    @Override
-    public String getParamValue(String param) {
-        if (!(mParams.containsKey(param))) {
-            return null;
-        }
-        return mParams.get(param);
-    }
-
-    @Override
-    public void setParamValue(String param, String value) {
-        mParams.put(param, value);
-    }
-
-}
diff --git a/core/java/com/google/android/gdata2/client/AndroidGDataClient.java b/core/java/com/google/android/gdata2/client/AndroidGDataClient.java
deleted file mode 100644
index 3721fa4..0000000
--- a/core/java/com/google/android/gdata2/client/AndroidGDataClient.java
+++ /dev/null
@@ -1,603 +0,0 @@
-// Copyright 2007 The Android Open Source Project
-
-package com.google.android.gdata2.client;
-
-import com.google.android.net.GoogleHttpClient;
-import com.google.wireless.gdata2.client.GDataClient;
-import com.google.wireless.gdata2.client.HttpException;
-import com.google.wireless.gdata2.client.QueryParams;
-import com.google.wireless.gdata2.data.StringUtils;
-import com.google.wireless.gdata2.parser.ParseException;
-import com.google.wireless.gdata2.serializer.GDataSerializer;
-import com.google.android.gdata2.client.QueryParamsImpl;
-
-import org.apache.http.Header;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpResponse;
-import org.apache.http.StatusLine;
-import org.apache.http.params.HttpParams;
-import org.apache.http.params.BasicHttpParams;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.client.methods.HttpUriRequest;
-import org.apache.http.entity.InputStreamEntity;
-import org.apache.http.entity.AbstractHttpEntity;
-import org.apache.http.entity.ByteArrayEntity;
-
-import android.content.ContentResolver;
-import android.content.Context;
-import android.net.http.AndroidHttpClient;
-import android.text.TextUtils;
-import android.util.Config;
-import android.util.Log;
-import android.os.SystemProperties;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
-import java.io.BufferedInputStream;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URLEncoder;
-
-/**
- * Implementation of a GDataClient using GoogleHttpClient to make HTTP
- * requests.  Always issues GETs and POSTs, using the X-HTTP-Method-Override
- * header when a PUT or DELETE is desired, to avoid issues with firewalls, etc.,
- * that do not allow methods other than GET or POST.
- */
-public class AndroidGDataClient implements GDataClient {
-
-    private static final String TAG = "GDataClient";
-    private static final boolean DEBUG = false;
-    private static final boolean LOCAL_LOGV = DEBUG ? Config.LOGD : Config.LOGV;
-
-    private static final String X_HTTP_METHOD_OVERRIDE =
-        "X-HTTP-Method-Override";
-
-    private static final String DEFAULT_USER_AGENT_APP_VERSION = "Android-GData/1.2";
-
-    private static final int MAX_REDIRECTS = 10;
-    private static String DEFAULT_GDATA_VERSION = "2.0";
-
-    // boolean system property that can be used to control whether or not
-    // requests/responses are gzip'd.
-    private static final String NO_GZIP_SYSTEM_PROPERTY = "sync.nogzip";
-
-    private String mGDataVersion; 
-    private final GoogleHttpClient mHttpClient;
-    private ContentResolver mResolver;
-
-    /**
-     * Interface for creating HTTP requests.  Used by
-     * {@link AndroidGDataClient#createAndExecuteMethod}, since HttpUriRequest does not allow for
-     * changing the URI after creation, e.g., when you want to follow a redirect.
-     */
-    private interface HttpRequestCreator {
-        HttpUriRequest createRequest(URI uri);
-    }
-
-    private static class GetRequestCreator implements HttpRequestCreator {
-        public GetRequestCreator() {
-        }
-
-        public HttpUriRequest createRequest(URI uri) {
-            HttpGet get = new HttpGet(uri);
-            return get;
-        }
-    }
-
-    private static class PostRequestCreator implements HttpRequestCreator {
-        private final String mMethodOverride;
-        private final HttpEntity mEntity;
-        public PostRequestCreator(String methodOverride, HttpEntity entity) {
-            mMethodOverride = methodOverride;
-            mEntity = entity;
-        }
-
-        public HttpUriRequest createRequest(URI uri) {
-            HttpPost post = new HttpPost(uri);
-            if (mMethodOverride != null) {
-                post.addHeader(X_HTTP_METHOD_OVERRIDE, mMethodOverride);
-            }
-            post.setEntity(mEntity);
-            return post;
-        }
-    }
-
-    // MAJOR TODO: make this work across redirects (if we can reset the InputStream).
-    // OR, read the bits into a local buffer (yuck, the media could be large).
-    private static class MediaPutRequestCreator implements HttpRequestCreator {
-        private final InputStream mMediaInputStream;
-        private final String mContentType;
-        public MediaPutRequestCreator(InputStream mediaInputStream, String contentType) {
-            mMediaInputStream = mediaInputStream;
-            mContentType = contentType;
-        }
-
-        public HttpUriRequest createRequest(URI uri) {
-            HttpPost post = new HttpPost(uri);
-            post.addHeader(X_HTTP_METHOD_OVERRIDE, "PUT");
-            // mMediaInputStream.reset();
-            InputStreamEntity entity = new InputStreamEntity(mMediaInputStream,
-                    -1 /* read until EOF */);
-            entity.setContentType(mContentType);
-            post.setEntity(entity);
-            return post;
-        }
-    }
-
-   
-    /**
-     * Creates a new AndroidGDataClient.
-     * 
-     * @param context The ContentResolver to get URL rewriting rules from
-     * through the Android proxy server, using null to indicate not using proxy.
-     * The context will also be used by GoogleHttpClient for configuration of 
-     * SSL session persistence.
-     */
-    public AndroidGDataClient(Context context) {
-       this(context, DEFAULT_USER_AGENT_APP_VERSION);
-    }
-
-    /**
-     * Creates a new AndroidGDataClient.
-     *
-     * @param context The ContentResolver to get URL rewriting rules from
-     * through the Android proxy server, using null to indicate not using proxy.
-     * The context will also be used by GoogleHttpClient for configuration of
-     * SSL session persistence.
-     * @param appAndVersion The application name and version to be used as the basis of the
-     * User-Agent.  e.g., Android-GData/1.5.0.
-     */
-    public AndroidGDataClient(Context context, String appAndVersion) {
-        this(context, appAndVersion, DEFAULT_GDATA_VERSION);
-    }
-
-    /**
-     * Creates a new AndroidGDataClient.
-     *
-     * @param context The ContentResolver to get URL rewriting rules from
-     * through the Android proxy server, using null to indicate not using proxy.
-     * The context will also be used by GoogleHttpClient for configuration of
-     * SSL session persistence.
-     * @param appAndVersion The application name and version to be used as the basis of the
-     * User-Agent.  e.g., Android-GData/1.5.0. 
-     * @param gdataVersion The gdata service version that should be 
-     * used, e.g. "2.0" 
-     *  
-     */
-    public AndroidGDataClient(Context context, String appAndVersion, String gdataVersion) {
-        mHttpClient = new GoogleHttpClient(context, appAndVersion,
-                true /* gzip capable */);
-        mHttpClient.enableCurlLogging(TAG, Log.VERBOSE);
-        mResolver = context.getContentResolver();
-        mGDataVersion = gdataVersion;
-    }
-
-
-    public void close() {
-        mHttpClient.close();
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see GDataClient#encodeUri(java.lang.String)
-     */
-    public String encodeUri(String uri) {
-        String encodedUri;
-        try {
-            encodedUri = URLEncoder.encode(uri, "UTF-8");
-        } catch (UnsupportedEncodingException uee) {
-            // should not happen.
-            Log.e("JakartaGDataClient",
-                  "UTF-8 not supported -- should not happen.  "
-                  + "Using default encoding.", uee);
-            encodedUri = URLEncoder.encode(uri);
-        }
-        return encodedUri;
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see com.google.wireless.gdata.client.GDataClient#createQueryParams()
-     */
-    public QueryParams createQueryParams() {
-        return new QueryParamsImpl();
-    }
-
-    // follows redirects
-    private InputStream createAndExecuteMethod(HttpRequestCreator creator,
-                                               String uriString,
-                                               String authToken,
-                                               String eTag,
-                                               String protocolVersion)
-        throws HttpException, IOException {
-
-        HttpResponse response = null;
-        int status = 500;
-        int redirectsLeft = MAX_REDIRECTS;
-
-        URI uri;
-        try {
-            uri = new URI(uriString);
-        } catch (URISyntaxException use) {
-            Log.w(TAG, "Unable to parse " + uriString + " as URI.", use);
-            throw new IOException("Unable to parse " + uriString + " as URI: "
-                    + use.getMessage());
-        }
-
-        // we follow redirects ourselves, since we want to follow redirects even on POSTs, which
-        // the HTTP library does not do.  following redirects ourselves also allows us to log
-        // the redirects using our own logging.
-        while (redirectsLeft > 0) {
-
-            HttpUriRequest request = creator.createRequest(uri);
-
-            if (!SystemProperties.getBoolean(NO_GZIP_SYSTEM_PROPERTY, false)) {
-                AndroidHttpClient.modifyRequestToAcceptGzipResponse(request);
-            }
-
-            // only add the auth token if not null (to allow for GData feeds that do not require
-            // authentication.)
-            if (!TextUtils.isEmpty(authToken)) {
-                request.addHeader("Authorization", "GoogleLogin auth=" + authToken);
-            }
-
-            // while by default we have a 2.0 in this variable, it is possible to construct
-            // a client that has an empty version field, to work with 1.0 services. 
-            if (!TextUtils.isEmpty(mGDataVersion)) {
-                request.addHeader("GDataVersion", mGDataVersion);
-            }
-
-            // if we have a passed down eTag value, we need to add several headers
-            if (!TextUtils.isEmpty(eTag)) { 
-                String method = request.getMethod();
-                Header overrideMethodHeader = request.getFirstHeader(X_HTTP_METHOD_OVERRIDE);
-                if (overrideMethodHeader != null) {
-                    method = overrideMethodHeader.getValue();
-                }
-                if ("GET".equals(method)) {
-                    // add the none match header, if the resource is not changed
-                    // this request will result in a 304 now.
-                    request.addHeader("If-None-Match", eTag);
-                } else if ("DELETE".equals(method) 
-                           || "PUT".equals(method)) {
-                    // now we send an if-match, but only if the passed in eTag is a strong eTag
-                    // as this only makes sense for a strong eTag
-                    if (!eTag.startsWith("W/")) {
-                        request.addHeader("If-Match", eTag);
-                    }
-                }
-            }
-
-            if (LOCAL_LOGV) {
-                for (Header h : request.getAllHeaders()) {
-                    Log.v(TAG, h.getName() + ": " + h.getValue());
-                }
-            }
-
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                    Log.d(TAG, "Executing " + request.getRequestLine().toString());
-            }
-
-            response = null;
-
-            try {
-                response = mHttpClient.execute(request);
-            } catch (IOException ioe) {
-                Log.w(TAG, "Unable to execute HTTP request." + ioe);
-                throw ioe;
-            }
-
-            StatusLine statusLine = response.getStatusLine();
-            if (statusLine == null) {
-                Log.w(TAG, "StatusLine is null.");
-                throw new NullPointerException("StatusLine is null -- should not happen.");
-            }
-
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, response.getStatusLine().toString());
-                for (Header h : response.getAllHeaders()) {
-                    Log.d(TAG, h.getName() + ": " + h.getValue());
-                }
-            }
-            status = statusLine.getStatusCode();
-
-            HttpEntity entity = response.getEntity();
-
-            if ((status >= 200) && (status < 300) && entity != null) {
-                InputStream in = AndroidHttpClient.getUngzippedContent(entity);
-                if (Log.isLoggable(TAG, Log.DEBUG)) {
-                    in = logInputStreamContents(in);
-                }
-                return in;
-            }
-
-            // TODO: handle 301, 307?
-            // TODO: let the http client handle the redirects, if we can be sure we'll never get a
-            // redirect on POST.
-            if (status == 302) {
-                // consume the content, so the connection can be closed.
-                entity.consumeContent();
-                Header location = response.getFirstHeader("Location");
-                if (location == null) {
-                    if (Log.isLoggable(TAG, Log.DEBUG)) {
-                        Log.d(TAG, "Redirect requested but no Location "
-                                + "specified.");
-                    }
-                    break;
-                }
-                if (Log.isLoggable(TAG, Log.DEBUG)) {
-                    Log.d(TAG, "Following redirect to " + location.getValue());
-                }
-                try {
-                    uri = new URI(location.getValue());
-                } catch (URISyntaxException use) {
-                    if (Log.isLoggable(TAG, Log.DEBUG)) {
-                        Log.d(TAG, "Unable to parse " + location.getValue() + " as URI.", use);
-                        throw new IOException("Unable to parse " + location.getValue()
-                                + " as URI.");
-                    }
-                    break;
-                }
-                --redirectsLeft;
-            } else {
-                break;
-            }
-        }
-
-        if (Log.isLoggable(TAG, Log.VERBOSE)) {
-            Log.v(TAG, "Received " + status + " status code.");
-        }
-        String errorMessage = null;
-        HttpEntity entity = response.getEntity();
-        try {
-            if (response != null && entity != null) {
-                InputStream in = AndroidHttpClient.getUngzippedContent(entity);
-                ByteArrayOutputStream baos = new ByteArrayOutputStream();
-                byte[] buf = new byte[8192];
-                int bytesRead = -1;
-                while ((bytesRead = in.read(buf)) != -1) {
-                    baos.write(buf, 0, bytesRead);
-                }
-                // TODO: use appropriate encoding, picked up from Content-Type.
-                errorMessage = new String(baos.toByteArray());
-                if (Log.isLoggable(TAG, Log.VERBOSE)) {
-                    Log.v(TAG, errorMessage);
-                }
-            }
-        } finally {
-            if (entity != null) {
-                entity.consumeContent();
-            }
-        }
-        String exceptionMessage = "Received " + status + " status code";
-        if (errorMessage != null) {
-            exceptionMessage += (": " + errorMessage);
-        }
-        throw new HttpException(exceptionMessage, status, null /* InputStream */);
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see GDataClient#getFeedAsStream(java.lang.String, java.lang.String)
-     */
-    public InputStream getFeedAsStream(String feedUrl,
-                                       String authToken,
-                                       String eTag,
-                                       String protocolVersion)
-        throws HttpException, IOException {
-
-        InputStream in = createAndExecuteMethod(new GetRequestCreator(), feedUrl, authToken, eTag, protocolVersion);
-        if (in != null) {
-            return in;
-        }
-        throw new IOException("Unable to access feed.");
-    }
-
-    /**
-     * Log the contents of the input stream.
-     * The original input stream is consumed, so the caller must use the
-     * BufferedInputStream that is returned.
-     * @param in InputStream
-     * @return replacement input stream for caller to use
-     * @throws IOException
-     */
-    private InputStream logInputStreamContents(InputStream in) throws IOException {
-        if (in == null) {
-            return in;
-        }
-        // bufferSize is the (arbitrary) maximum amount to log.
-        // The original InputStream is wrapped in a
-        // BufferedInputStream with a 16K buffer.  This lets
-        // us read up to 16K, write it to the log, and then
-        // reset the stream so the the original client can
-        // then read the data.  The BufferedInputStream
-        // provides the mark and reset support, even when
-        // the original InputStream does not.
-        final int bufferSize = 16384;
-        BufferedInputStream bin = new BufferedInputStream(in, bufferSize);
-        bin.mark(bufferSize);
-        int wanted = bufferSize;
-        int totalReceived = 0;
-        byte buf[] = new byte[wanted];
-        while (wanted > 0) {
-            int got = bin.read(buf, totalReceived, wanted);
-            if (got <= 0) break; // EOF
-            wanted -= got;
-            totalReceived += got;
-        }
-        Log.d(TAG, new String(buf, 0, totalReceived, "UTF-8"));
-        bin.reset();
-        return bin;
-    }
-
-    public InputStream getMediaEntryAsStream(String mediaEntryUrl, String authToken, String eTag, String protocolVersion)
-            throws HttpException, IOException {
-
-        InputStream in = createAndExecuteMethod(new GetRequestCreator(), mediaEntryUrl, authToken, eTag, protocolVersion);
-
-        if (in != null) {
-            return in;
-        }
-        throw new IOException("Unable to access media entry.");
-    }
-
-    /* (non-Javadoc)
-    * @see GDataClient#createEntry
-    */
-    public InputStream createEntry(String feedUrl,
-                                   String authToken,
-                                   String protocolVersion, 
-                                   GDataSerializer entry)
-        throws HttpException, IOException {
-
-        HttpEntity entity = createEntityForEntry(entry, GDataSerializer.FORMAT_CREATE);
-        InputStream in = createAndExecuteMethod(
-                new PostRequestCreator(null /* override */, entity),
-                feedUrl,
-                authToken,
-                null,
-                protocolVersion);
-        if (in != null) {
-            return in;
-        }
-        throw new IOException("Unable to create entry.");
-    }
-
-    /* (non-Javadoc)
-     * @see GDataClient#updateEntry
-     */
-    public InputStream updateEntry(String editUri,
-                                   String authToken,
-                                   String eTag,
-                                   String protocolVersion, 
-                                   GDataSerializer entry)
-        throws HttpException, IOException {
-        HttpEntity entity = createEntityForEntry(entry, GDataSerializer.FORMAT_UPDATE);
-        final String method = entry.getSupportsPartial() ? "PATCH" : "PUT";
-        InputStream in = createAndExecuteMethod(
-                new PostRequestCreator(method, entity),
-                editUri,
-                authToken,
-                eTag,
-                protocolVersion);
-        if (in != null) {
-            return in;
-        }
-        throw new IOException("Unable to update entry.");
-    }
-
-    /* (non-Javadoc)
-     * @see GDataClient#deleteEntry
-     */
-    public void deleteEntry(String editUri, String authToken, String eTag)
-        throws HttpException, IOException {
-        if (StringUtils.isEmpty(editUri)) {
-            throw new IllegalArgumentException(
-                    "you must specify an non-empty edit url");
-        }
-        InputStream in =
-            createAndExecuteMethod(
-                    new PostRequestCreator("DELETE", null /* entity */),
-                    editUri,
-                    authToken,
-                    eTag,
-                    null /* protocolVersion, not required for a delete */);
-        if (in == null) {
-            throw new IOException("Unable to delete entry.");
-        }
-        try {
-            in.close();
-        } catch (IOException ioe) {
-            // ignore
-        }
-    }
-
-    public InputStream updateMediaEntry(String editUri, String authToken, String eTag,
-            String protocolVersion, InputStream mediaEntryInputStream, String contentType)
-        throws HttpException, IOException {
-        InputStream in = createAndExecuteMethod(
-                new MediaPutRequestCreator(mediaEntryInputStream, contentType),
-                editUri,
-                authToken,
-                eTag,
-                protocolVersion);
-        if (in != null) {
-            return in;
-        }
-        throw new IOException("Unable to write media entry.");
-    }
-
-    private HttpEntity createEntityForEntry(GDataSerializer entry, int format) throws IOException {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        try {
-            entry.serialize(baos, format);
-        } catch (IOException ioe) {
-            Log.e(TAG, "Unable to serialize entry.", ioe);
-            throw ioe;
-        } catch (ParseException pe) {
-            Log.e(TAG, "Unable to serialize entry.", pe);
-            throw new IOException("Unable to serialize entry: " + pe.getMessage());
-        }
-
-        byte[] entryBytes = baos.toByteArray();
-
-        if (entryBytes != null && Log.isLoggable(TAG, Log.DEBUG)) {
-            try {
-                Log.d(TAG, "Serialized entry: " + new String(entryBytes, "UTF-8"));
-            } catch (UnsupportedEncodingException uee) {
-                // should not happen
-                throw new IllegalStateException("UTF-8 should be supported!",
-                        uee);
-            }
-        }
-
-        AbstractHttpEntity entity;
-        if (SystemProperties.getBoolean(NO_GZIP_SYSTEM_PROPERTY, false)) {
-            entity = new ByteArrayEntity(entryBytes);
-        } else {
-            entity = AndroidHttpClient.getCompressedEntity(entryBytes, mResolver);
-        }
-
-        entity.setContentType(entry.getContentType());
-        return entity;
-    }
-
-    /**
-     * Connects to a GData server (specified by the batchUrl) and submits a
-     * batch for processing.  The response from the server is returned as an
-     * {@link InputStream}.  The caller is responsible for calling
-     * {@link InputStream#close()} on the returned {@link InputStream}.
-     *
-     * @param batchUrl The batch url to which the batch is submitted.
-     * @param authToken the authentication token that should be used when
-     * submitting the batch.
-     * @param protocolVersion The version of the protocol that 
-     *                 should be used for this request.
-     * @param batch The batch of entries to submit.
-     * @throws IOException Thrown if an io error occurs while communicating with
-     * the service.
-     * @throws HttpException if the service returns an error response.
-     */
-    public InputStream submitBatch(String batchUrl,
-       String authToken,
-       String protocolVersion,
-       GDataSerializer batch)
-       throws HttpException, IOException
-    {
-        HttpEntity entity = createEntityForEntry(batch, GDataSerializer.FORMAT_BATCH);
-        InputStream in = createAndExecuteMethod(
-                new PostRequestCreator("POST", entity),
-                batchUrl,
-                authToken,
-                null,
-                protocolVersion);
-        if (in != null) {
-            return in;
-        }
-        throw new IOException("Unable to process batch request.");
-    }
-}   
diff --git a/core/java/com/google/android/gdata2/client/AndroidXmlParserFactory.java b/core/java/com/google/android/gdata2/client/AndroidXmlParserFactory.java
deleted file mode 100644
index f097706..0000000
--- a/core/java/com/google/android/gdata2/client/AndroidXmlParserFactory.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package com.google.android.gdata2.client;
-
-import com.google.wireless.gdata2.parser.xml.XmlParserFactory;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-import org.xmlpull.v1.XmlSerializer;
-
-import android.util.Xml;
-
-/**
- * XmlParserFactory for the Android platform.
- */
-public class AndroidXmlParserFactory implements XmlParserFactory {
-
-    /*
-     * (non-javadoc)
-     * @see XmlParserFactory#createParser
-     */
-    public XmlPullParser createParser() throws XmlPullParserException {
-        return Xml.newPullParser();
-    }
-
-    /*
-     * (non-javadoc)
-     * @see XmlParserFactory#createSerializer
-     */
-    public XmlSerializer createSerializer() throws XmlPullParserException {
-        return Xml.newSerializer();
-    }
-}
diff --git a/core/java/com/google/android/gdata2/client/QueryParamsImpl.java b/core/java/com/google/android/gdata2/client/QueryParamsImpl.java
deleted file mode 100644
index a26f4ce..0000000
--- a/core/java/com/google/android/gdata2/client/QueryParamsImpl.java
+++ /dev/null
@@ -1,99 +0,0 @@
-package com.google.android.gdata2.client;
-import com.google.wireless.gdata2.client.QueryParams;
-
-import android.text.TextUtils;
-import android.util.Log;
-
-import java.io.UnsupportedEncodingException;
-import java.net.URLEncoder;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Simple implementation of the QueryParams interface.
- */
-// TODO: deal with categories
-public class QueryParamsImpl extends QueryParams {
-
-    private final Map<String,String> mParams = new HashMap<String,String>();
-
-    /**
-     * Creates a new empty QueryParamsImpl.
-     */
-    public QueryParamsImpl() {
-    }
-
-    @Override
-    public void clear() {
-        setEntryId(null);
-        mParams.clear();
-    }
-
-    @Override
-    public String generateQueryUrl(String feedUrl) {
-
-        if (TextUtils.isEmpty(getEntryId()) &&
-            mParams.isEmpty()) {
-            // nothing to do
-            return feedUrl;
-        }
-
-        // handle entry IDs
-        if (!TextUtils.isEmpty(getEntryId())) {
-            if (!mParams.isEmpty()) {
-                throw new IllegalStateException("Cannot set both an entry ID "
-                        + "and other query paramters.");
-            }
-            return feedUrl + '/' + getEntryId();
-        }
-
-        // otherwise, append the querystring params.
-        StringBuilder sb = new StringBuilder();
-        sb.append(feedUrl);
-        Set<String> params = mParams.keySet();
-        boolean first = true;
-        if (feedUrl.contains("?")) {
-            first = false;
-        } else {
-            sb.append('?');
-        }
-        for (String param : params) {
-            if (first) {
-                first = false;
-            } else {
-                sb.append('&');
-            }
-            sb.append(param);
-            sb.append('=');
-            String value = mParams.get(param);
-            String encodedValue = null;
-
-            try {
-                encodedValue = URLEncoder.encode(value, "UTF-8");
-            } catch (UnsupportedEncodingException uee) {
-                // should not happen.
-                Log.w("QueryParamsImpl",
-                      "UTF-8 not supported -- should not happen.  "
-                      + "Using default encoding.", uee);
-                encodedValue = URLEncoder.encode(value);
-            }
-            sb.append(encodedValue);
-        }
-        return sb.toString();
-    }
-
-    @Override
-    public String getParamValue(String param) {
-        if (!(mParams.containsKey(param))) {
-            return null;
-        }
-        return mParams.get(param);
-    }
-
-    @Override
-    public void setParamValue(String param, String value) {
-        mParams.put(param, value);
-    }
-
-}
diff --git a/preloaded-classes b/preloaded-classes
index ab83b67..08fc2a1 100644
--- a/preloaded-classes
+++ b/preloaded-classes
@@ -1097,10 +1097,6 @@
 com.android.internal.widget.NumberPickerButton
 com.android.internal.widget.RotarySelector
 com.android.internal.widget.Smileys
-com.google.android.gdata.client.AndroidGDataClient
-com.google.android.gdata.client.AndroidGDataClient$GetRequestCreator
-com.google.android.gdata.client.AndroidGDataClient$PostRequestCreator
-com.google.android.gdata.client.QueryParamsImpl
 com.google.android.gles_jni.EGLDisplayImpl
 com.google.android.gles_jni.EGLImpl
 com.google.android.gles_jni.EGLSurfaceImpl
@@ -1115,17 +1111,6 @@
 com.google.android.net.ParentalControlState$1
 com.google.android.net.UrlRules
 com.google.android.net.UrlRules$Rule
-com.google.wireless.gdata.calendar.client.CalendarClient
-com.google.wireless.gdata.calendar.data.CalendarEntry
-com.google.wireless.gdata.calendar.data.CalendarsFeed
-com.google.wireless.gdata.calendar.data.EventEntry
-com.google.wireless.gdata.calendar.data.Who
-com.google.wireless.gdata.calendar.parser.xml.XmlCalendarGDataParserFactory
-com.google.wireless.gdata.calendar.serializer.xml.XmlEventEntryGDataSerializer
-com.google.wireless.gdata.client.GDataServiceClient
-com.google.wireless.gdata.client.QueryParams
-com.google.wireless.gdata.data.Entry
-com.google.wireless.gdata.parser.xml.XmlGDataParser
 com.ibm.icu4jni.charset.CharsetDecoderICU
 com.ibm.icu4jni.charset.CharsetEncoderICU
 com.ibm.icu4jni.charset.CharsetICU
diff --git a/tests/AndroidTests/res/raw/calendarjs.txt b/tests/AndroidTests/res/raw/calendarjs.txt
deleted file mode 100644
index 15f7bab..0000000
--- a/tests/AndroidTests/res/raw/calendarjs.txt
+++ /dev/null
@@ -1 +0,0 @@
-{"version":"1.0","encoding":"UTF-8","feed":{"xmlns":"http://www.w3.org/2005/Atom","xmlns$openSearch":"http://a9.com/-/spec/opensearchrss/1.0/","xmlns$gd":"http://schemas.google.com/g/2005","xmlns$gCal":"http://schemas.google.com/gCal/2005","id":{"$t":"http://www.google.com/calendar/feeds/wg%40voiceme.net/public/basic"},"updated":{"$t":"2007-02-06T02:55:15.000Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/g/2005#event"}],"title":{"type":"text","$t":"w g"},"subtitle":{"type":"text","$t":"w g"},"link":[{"rel":"http://schemas.google.com/g/2005#feed","type":"application/atom+xml","href":"http://www.google.com/calendar/feeds/wg%40voiceme.net/public/basic"},{"rel":"self","type":"application/atom+xml","href":"http://www.google.com/calendar/feeds/wg%40voiceme.net/public/basic?alt\u003Djson\u0026max-results\u003D25"}],"author":[{"name":{"$t":"w g"},"email":{"$t":"wg@voiceme.net"}}],"generator":{"version":"1.0","uri":"http://www.google.com/calendar","$t":"Google Calendar"},"openSearch$totalResults":{"$t":"13"},"openSearch$startIndex":{"$t":"1"},"openSearch$itemsPerPage":{"$t":"25"},"gCal$timezone":{"value":"America/Los_Angeles"},"entry":[{"id":{"$t":"http://www.google.com/calendar/feeds/wg%40voiceme.net/public/basic/7iqc1ro0ihc69vhsiq3uabooig"},"published":{"$t":"2007-02-05T22:04:50.000Z"},"updated":{"$t":"2007-02-05T22:04:50.000Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/g/2005#event"}],"title":{"type":"text","$t":"skate"},"summary":{"type":"html","$t":"When: Wed Feb 7, 2007 13:30 to Wed Feb 7, 2007 16:00\u0026nbsp; PST\u003Cbr\u003E   \u003Cbr\u003EEvent Status:     confirmed"},"content":{"type":"text","$t":"When: Wed Feb 7, 2007 13:30 to Wed Feb 7, 2007 16:00\u0026nbsp; PST\u003Cbr\u003E   \u003Cbr\u003EEvent Status:     confirmed"},"link":[{"rel":"alternate","type":"text/html","href":"http://www.google.com/calendar/event?eid\u003DN2lxYzFybzBpaGM2OXZoc2lxM3VhYm9vaWcgd2dAdm9pY2VtZS5uZXQ","title":"alternate"},{"rel":"self","type":"application/atom+xml","href":"http://www.google.com/calendar/feeds/wg%40voiceme.net/public/basic/7iqc1ro0ihc69vhsiq3uabooig"}],"author":[{"name":{"$t":"w g"},"email":{"$t":"wg@voiceme.net"}}],"gCal$sendEventNotifications":{"value":"false"}},{"id":{"$t":"http://www.google.com/calendar/feeds/wg%40voiceme.net/public/basic/kp4gil76n2vcrkt9kaotj3s12c"},"published":{"$t":"2007-02-05T22:04:42.000Z"},"updated":{"$t":"2007-02-05T22:04:42.000Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/g/2005#event"}],"title":{"type":"text","$t":"skate"},"summary":{"type":"html","$t":"When: Fri Feb 9, 2007 15:30 to Fri Feb 9, 2007 18:00\u0026nbsp; PST\u003Cbr\u003E   \u003Cbr\u003EEvent Status:     confirmed"},"content":{"type":"text","$t":"When: Fri Feb 9, 2007 15:30 to Fri Feb 9, 2007 18:00\u0026nbsp; PST\u003Cbr\u003E   \u003Cbr\u003EEvent Status:     confirmed"},"link":[{"rel":"alternate","type":"text/html","href":"http://www.google.com/calendar/event?eid\u003Da3A0Z2lsNzZuMnZjcmt0OWthb3RqM3MxMmMgd2dAdm9pY2VtZS5uZXQ","title":"alternate"},{"rel":"self","type":"application/atom+xml","href":"http://www.google.com/calendar/feeds/wg%40voiceme.net/public/basic/kp4gil76n2vcrkt9kaotj3s12c"}],"author":[{"name":{"$t":"w g"},"email":{"$t":"wg@voiceme.net"}}],"gCal$sendEventNotifications":{"value":"false"}},{"id":{"$t":"http://www.google.com/calendar/feeds/wg%40voiceme.net/public/basic/gkhb48fj68lcp15fd1k03tjbj0"},"published":{"$t":"2007-02-05T22:04:35.000Z"},"updated":{"$t":"2007-02-05T22:04:35.000Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/g/2005#event"}],"title":{"type":"text","$t":"test event 6"},"summary":{"type":"html","$t":"When: Sat Feb 10, 2007 14:00 to Sat Feb 10, 2007 17:00\u0026nbsp; PST\u003Cbr\u003E   \u003Cbr\u003EEvent Status:     confirmed"},"content":{"type":"text","$t":"When: Sat Feb 10, 2007 14:00 to Sat Feb 10, 2007 17:00\u0026nbsp; PST\u003Cbr\u003E   \u003Cbr\u003EEvent Status:     confirmed"},"link":[{"rel":"alternate","type":"text/html","href":"http://www.google.com/calendar/event?eid\u003DZ2toYjQ4Zmo2OGxjcDE1ZmQxazAzdGpiajAgd2dAdm9pY2VtZS5uZXQ","title":"alternate"},{"rel":"self","type":"application/atom+xml","href":"http://www.google.com/calendar/feeds/wg%40voiceme.net/public/basic/gkhb48fj68lcp15fd1k03tjbj0"}],"author":[{"name":{"$t":"w g"},"email":{"$t":"wg@voiceme.net"}}],"gCal$sendEventNotifications":{"value":"false"}},{"id":{"$t":"http://www.google.com/calendar/feeds/wg%40voiceme.net/public/basic/32p5g68cpean3p2ol7kanj38sg"},"published":{"$t":"2007-02-05T22:04:29.000Z"},"updated":{"$t":"2007-02-05T22:04:29.000Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/g/2005#event"}],"title":{"type":"text","$t":"test event 5"},"summary":{"type":"html","$t":"When: Fri Feb 9, 2007 09:00 to 10:30\u0026nbsp; PST\u003Cbr\u003E   \u003Cbr\u003EEvent Status:     confirmed"},"content":{"type":"text","$t":"When: Fri Feb 9, 2007 09:00 to 10:30\u0026nbsp; PST\u003Cbr\u003E   \u003Cbr\u003EEvent Status:     confirmed"},"link":[{"rel":"alternate","type":"text/html","href":"http://www.google.com/calendar/event?eid\u003DMzJwNWc2OGNwZWFuM3Ayb2w3a2FuajM4c2cgd2dAdm9pY2VtZS5uZXQ","title":"alternate"},{"rel":"self","type":"application/atom+xml","href":"http://www.google.com/calendar/feeds/wg%40voiceme.net/public/basic/32p5g68cpean3p2ol7kanj38sg"}],"author":[{"name":{"$t":"w g"},"email":{"$t":"wg@voiceme.net"}}],"gCal$sendEventNotifications":{"value":"false"}},{"id":{"$t":"http://www.google.com/calendar/feeds/wg%40voiceme.net/public/basic/tfqpth26conshdmav0apje1tf4"},"published":{"$t":"2007-02-05T22:04:19.000Z"},"updated":{"$t":"2007-02-05T22:04:19.000Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/g/2005#event"}],"title":{"type":"text","$t":"skate"},"summary":{"type":"html","$t":"When: Thu Feb 8, 2007 15:00 to Thu Feb 8, 2007 17:00\u0026nbsp; PST\u003Cbr\u003E   \u003Cbr\u003EEvent Status:     confirmed"},"content":{"type":"text","$t":"When: Thu Feb 8, 2007 15:00 to Thu Feb 8, 2007 17:00\u0026nbsp; PST\u003Cbr\u003E   \u003Cbr\u003EEvent Status:     confirmed"},"link":[{"rel":"alternate","type":"text/html","href":"http://www.google.com/calendar/event?eid\u003DdGZxcHRoMjZjb25zaGRtYXYwYXBqZTF0ZjQgd2dAdm9pY2VtZS5uZXQ","title":"alternate"},{"rel":"self","type":"application/atom+xml","href":"http://www.google.com/calendar/feeds/wg%40voiceme.net/public/basic/tfqpth26conshdmav0apje1tf4"}],"author":[{"name":{"$t":"w g"},"email":{"$t":"wg@voiceme.net"}}],"gCal$sendEventNotifications":{"value":"false"}},{"id":{"$t":"http://www.google.com/calendar/feeds/wg%40voiceme.net/public/basic/onbo9mhbr5m6mo356nog7uel4s"},"published":{"$t":"2007-02-05T22:04:07.000Z"},"updated":{"$t":"2007-02-05T22:04:07.000Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/g/2005#event"}],"title":{"type":"text","$t":"Sharks at Anaheim"},"summary":{"type":"html","$t":"When: Wed Feb 7, 2007 19:00 to 22:00\u0026nbsp; PST\u003Cbr\u003E   \u003Cbr\u003EEvent Status:     confirmed"},"content":{"type":"text","$t":"When: Wed Feb 7, 2007 19:00 to 22:00\u0026nbsp; PST\u003Cbr\u003E   \u003Cbr\u003EEvent Status:     confirmed"},"link":[{"rel":"alternate","type":"text/html","href":"http://www.google.com/calendar/event?eid\u003Db25ibzltaGJyNW02bW8zNTZub2c3dWVsNHMgd2dAdm9pY2VtZS5uZXQ","title":"alternate"},{"rel":"self","type":"application/atom+xml","href":"http://www.google.com/calendar/feeds/wg%40voiceme.net/public/basic/onbo9mhbr5m6mo356nog7uel4s"}],"author":[{"name":{"$t":"w g"},"email":{"$t":"wg@voiceme.net"}}],"gCal$sendEventNotifications":{"value":"true"}},{"id":{"$t":"http://www.google.com/calendar/feeds/wg%40voiceme.net/public/basic/tjqrd9fve576hieh3sa67nql5k"},"published":{"$t":"2007-02-05T22:04:02.000Z"},"updated":{"$t":"2007-02-05T22:04:02.000Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/g/2005#event"}],"title":{"type":"text","$t":"Sharks vs. ANAHEIM"},"summary":{"type":"html","$t":"When: Tue Feb 6, 2007 19:30 to 22:30\u0026nbsp; PST\u003Cbr\u003E   \u003Cbr\u003EEvent Status:     confirmed"},"content":{"type":"text","$t":"When: Tue Feb 6, 2007 19:30 to 22:30\u0026nbsp; PST\u003Cbr\u003E   \u003Cbr\u003EEvent Status:     confirmed"},"link":[{"rel":"alternate","type":"text/html","href":"http://www.google.com/calendar/event?eid\u003DdGpxcmQ5ZnZlNTc2aGllaDNzYTY3bnFsNWsgd2dAdm9pY2VtZS5uZXQ","title":"alternate"},{"rel":"self","type":"application/atom+xml","href":"http://www.google.com/calendar/feeds/wg%40voiceme.net/public/basic/tjqrd9fve576hieh3sa67nql5k"}],"author":[{"name":{"$t":"w g"},"email":{"$t":"wg@voiceme.net"}}],"gCal$sendEventNotifications":{"value":"true"}},{"id":{"$t":"http://www.google.com/calendar/feeds/wg%40voiceme.net/public/basic/or6dtpn065f9mntond4jh2docc"},"published":{"$t":"2007-02-05T22:03:52.000Z"},"updated":{"$t":"2007-02-05T22:03:52.000Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/g/2005#event"}],"title":{"type":"text","$t":"skate"},"summary":{"type":"html","$t":"When: Tue Feb 6, 2007 14:00 to 15:00\u0026nbsp; PST\u003Cbr\u003E   \u003Cbr\u003EEvent Status:     confirmed"},"content":{"type":"text","$t":"When: Tue Feb 6, 2007 14:00 to 15:00\u0026nbsp; PST\u003Cbr\u003E   \u003Cbr\u003EEvent Status:     confirmed"},"link":[{"rel":"alternate","type":"text/html","href":"http://www.google.com/calendar/event?eid\u003Db3I2ZHRwbjA2NWY5bW50b25kNGpoMmRvY2Mgd2dAdm9pY2VtZS5uZXQ","title":"alternate"},{"rel":"self","type":"application/atom+xml","href":"http://www.google.com/calendar/feeds/wg%40voiceme.net/public/basic/or6dtpn065f9mntond4jh2docc"}],"author":[{"name":{"$t":"w g"},"email":{"$t":"wg@voiceme.net"}}],"gCal$sendEventNotifications":{"value":"false"}},{"id":{"$t":"http://www.google.com/calendar/feeds/wg%40voiceme.net/public/basic/k70v8o4jt1afi17hg2spavq1c0"},"published":{"$t":"2007-02-05T22:03:36.000Z"},"updated":{"$t":"2007-02-05T22:03:36.000Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/g/2005#event"}],"title":{"type":"text","$t":"lunch"},"summary":{"type":"html","$t":"Recurring Event\u003Cbr\u003E First start: 2007-02-06 12:00:00 PST \u003Cbr\u003E Duration: 3600    \u003Cbr\u003EEvent Status:     confirmed"},"content":{"type":"text","$t":"Recurring Event\u003Cbr\u003E First start: 2007-02-06 12:00:00 PST \u003Cbr\u003E Duration: 3600    \u003Cbr\u003EEvent Status:     confirmed"},"link":[{"rel":"alternate","type":"text/html","href":"http://www.google.com/calendar/event?eid\u003DazcwdjhvNGp0MWFmaTE3aGcyc3BhdnExYzBfMjAwNzAyMDZUMjAwMDAwWiB3Z0B2b2ljZW1lLm5ldA","title":"alternate"},{"rel":"self","type":"application/atom+xml","href":"http://www.google.com/calendar/feeds/wg%40voiceme.net/public/basic/k70v8o4jt1afi17hg2spavq1c0"}],"author":[{"name":{"$t":"w g"},"email":{"$t":"wg@voiceme.net"}}],"gCal$sendEventNotifications":{"value":"true"}},{"id":{"$t":"http://www.google.com/calendar/feeds/wg%40voiceme.net/public/basic/6ee7b8nohdt03tv0gknm4v7124"},"published":{"$t":"2007-02-05T22:03:19.000Z"},"updated":{"$t":"2007-02-05T22:03:19.000Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/g/2005#event"}],"title":{"type":"text","$t":"test event 4"},"summary":{"type":"html","$t":"When: Tue Feb 6, 2007 09:00 to 11:00\u0026nbsp; PST\u003Cbr\u003E   \u003Cbr\u003EEvent Status:     confirmed"},"content":{"type":"text","$t":"When: Tue Feb 6, 2007 09:00 to 11:00\u0026nbsp; PST\u003Cbr\u003E   \u003Cbr\u003EEvent Status:     confirmed"},"link":[{"rel":"alternate","type":"text/html","href":"http://www.google.com/calendar/event?eid\u003DNmVlN2I4bm9oZHQwM3R2MGdrbm00djcxMjQgd2dAdm9pY2VtZS5uZXQ","title":"alternate"},{"rel":"self","type":"application/atom+xml","href":"http://www.google.com/calendar/feeds/wg%40voiceme.net/public/basic/6ee7b8nohdt03tv0gknm4v7124"}],"author":[{"name":{"$t":"w g"},"email":{"$t":"wg@voiceme.net"}}],"gCal$sendEventNotifications":{"value":"false"}},{"id":{"$t":"http://www.google.com/calendar/feeds/wg%40voiceme.net/public/basic/of1vh1r2q5aqdplo65i8bqbn3o"},"published":{"$t":"2007-02-05T22:03:11.000Z"},"updated":{"$t":"2007-02-05T22:03:11.000Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/g/2005#event"}],"title":{"type":"text","$t":"test event 3"},"summary":{"type":"html","$t":"When: Mon Feb 5, 2007 18:00 to 19:00\u0026nbsp; PST\u003Cbr\u003E   \u003Cbr\u003EEvent Status:     confirmed"},"content":{"type":"text","$t":"When: Mon Feb 5, 2007 18:00 to 19:00\u0026nbsp; PST\u003Cbr\u003E   \u003Cbr\u003EEvent Status:     confirmed"},"link":[{"rel":"alternate","type":"text/html","href":"http://www.google.com/calendar/event?eid\u003Db2YxdmgxcjJxNWFxZHBsbzY1aThicWJuM28gd2dAdm9pY2VtZS5uZXQ","title":"alternate"},{"rel":"self","type":"application/atom+xml","href":"http://www.google.com/calendar/feeds/wg%40voiceme.net/public/basic/of1vh1r2q5aqdplo65i8bqbn3o"}],"author":[{"name":{"$t":"w g"},"email":{"$t":"wg@voiceme.net"}}],"gCal$sendEventNotifications":{"value":"false"}},{"id":{"$t":"http://www.google.com/calendar/feeds/wg%40voiceme.net/public/basic/s7ahgfomlgii9qbkgpfbinr9u8"},"published":{"$t":"2007-02-05T22:02:40.000Z"},"updated":{"$t":"2007-02-05T22:03:04.000Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/g/2005#event"}],"title":{"type":"text","$t":"test event 2"},"summary":{"type":"html","$t":"When: Mon Feb 5, 2007 16:30 to 17:30\u0026nbsp; PST\u003Cbr\u003E   \u003Cbr\u003EEvent Status:     confirmed"},"content":{"type":"text","$t":"When: Mon Feb 5, 2007 16:30 to 17:30\u0026nbsp; PST\u003Cbr\u003E   \u003Cbr\u003EEvent Status:     confirmed"},"link":[{"rel":"alternate","type":"text/html","href":"http://www.google.com/calendar/event?eid\u003DczdhaGdmb21sZ2lpOXFia2dwZmJpbnI5dTggd2dAdm9pY2VtZS5uZXQ","title":"alternate"},{"rel":"self","type":"application/atom+xml","href":"http://www.google.com/calendar/feeds/wg%40voiceme.net/public/basic/s7ahgfomlgii9qbkgpfbinr9u8"}],"author":[{"name":{"$t":"w g"},"email":{"$t":"wg@voiceme.net"}}],"gCal$sendEventNotifications":{"value":"false"}},{"id":{"$t":"http://www.google.com/calendar/feeds/wg%40voiceme.net/public/basic/rl8focglfe6jndql4u8lg73q5k"},"published":{"$t":"2007-02-05T22:02:28.000Z"},"updated":{"$t":"2007-02-05T22:02:53.000Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/g/2005#event"}],"title":{"type":"text","$t":"test event 1"},"summary":{"type":"html","$t":"When: Mon Feb 5, 2007 15:00 to Mon Feb 5, 2007 16:00\u0026nbsp; PST\u003Cbr\u003E   \u003Cbr\u003EEvent Status:     confirmed"},"content":{"type":"text","$t":"When: Mon Feb 5, 2007 15:00 to Mon Feb 5, 2007 16:00\u0026nbsp; PST\u003Cbr\u003E   \u003Cbr\u003EEvent Status:     confirmed"},"link":[{"rel":"alternate","type":"text/html","href":"http://www.google.com/calendar/event?eid\u003Dcmw4Zm9jZ2xmZTZqbmRxbDR1OGxnNzNxNWsgd2dAdm9pY2VtZS5uZXQ","title":"alternate"},{"rel":"self","type":"application/atom+xml","href":"http://www.google.com/calendar/feeds/wg%40voiceme.net/public/basic/rl8focglfe6jndql4u8lg73q5k"}],"author":[{"name":{"$t":"w g"},"email":{"$t":"wg@voiceme.net"}}],"gCal$sendEventNotifications":{"value":"false"}}]}}
\ No newline at end of file
diff --git a/tests/AndroidTests/res/raw/calendarjsgz.jsgz b/tests/AndroidTests/res/raw/calendarjsgz.jsgz
deleted file mode 100644
index 6f1bf54..0000000
--- a/tests/AndroidTests/res/raw/calendarjsgz.jsgz
+++ /dev/null
Binary files differ
diff --git a/tests/AndroidTests/res/raw/calendarxml.xml b/tests/AndroidTests/res/raw/calendarxml.xml
deleted file mode 100644
index 1adcd74..0000000
--- a/tests/AndroidTests/res/raw/calendarxml.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:gd='http://schemas.google.com/g/2005' xmlns:gCal='http://schemas.google.com/gCal/2005'><id>http://www.google.com/calendar/feeds/default/private/full</id><updated>2007-02-05T22:04:50.000Z</updated><category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/g/2005#event'></category><title type='text'>w g</title><subtitle type='text'>w g</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full'></link><link rel='http://schemas.google.com/g/2005#post' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full'></link><link rel='self' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full?max-results=25'></link><author><name>w g</name><email>wg@voiceme.net</email></author><generator version='1.0' uri='http://www.google.com/calendar'>Google Calendar</generator><openSearch:totalResults>13</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><gCal:timezone value='America/Los_Angeles'></gCal:timezone><entry><id>http://www.google.com/calendar/feeds/default/private/full/7iqc1ro0ihc69vhsiq3uabooig</id><published>2007-02-05T22:04:50.000Z</published><updated>2007-02-05T22:04:50.000Z</updated><category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/g/2005#event'></category><title type='text'>skate</title><content type='text'></content><link rel='alternate' type='text/html' href='http://www.google.com/calendar/hosted/voiceme.net/event?eid=N2lxYzFybzBpaGM2OXZoc2lxM3VhYm9vaWcgd2dAdm9pY2VtZS5uZXQ' title='alternate'></link><link rel='self' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/7iqc1ro0ihc69vhsiq3uabooig'></link><link rel='edit' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/7iqc1ro0ihc69vhsiq3uabooig/63306396290'></link><author><name>w g</name><email>wg@voiceme.net</email></author><gd:comments><gd:feedLink href='http://www.google.com/calendar/feeds/default/private/full/7iqc1ro0ihc69vhsiq3uabooig/comments'></gd:feedLink></gd:comments><gd:eventStatus value='http://schemas.google.com/g/2005#event.confirmed'></gd:eventStatus><gd:visibility value='http://schemas.google.com/g/2005#event.default'></gd:visibility><gCal:sendEventNotifications value='false'></gCal:sendEventNotifications><gd:transparency value='http://schemas.google.com/g/2005#event.opaque'></gd:transparency><gd:where></gd:where><gd:when startTime='2007-02-07T13:30:00.000-08:00' endTime='2007-02-07T16:00:00.000-08:00'><gd:reminder minutes='10'></gd:reminder></gd:when></entry><entry><id>http://www.google.com/calendar/feeds/default/private/full/kp4gil76n2vcrkt9kaotj3s12c</id><published>2007-02-05T22:04:42.000Z</published><updated>2007-02-05T22:04:42.000Z</updated><category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/g/2005#event'></category><title type='text'>skate</title><content type='text'></content><link rel='alternate' type='text/html' href='http://www.google.com/calendar/hosted/voiceme.net/event?eid=a3A0Z2lsNzZuMnZjcmt0OWthb3RqM3MxMmMgd2dAdm9pY2VtZS5uZXQ' title='alternate'></link><link rel='self' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/kp4gil76n2vcrkt9kaotj3s12c'></link><link rel='edit' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/kp4gil76n2vcrkt9kaotj3s12c/63306396282'></link><author><name>w g</name><email>wg@voiceme.net</email></author><gd:comments><gd:feedLink href='http://www.google.com/calendar/feeds/default/private/full/kp4gil76n2vcrkt9kaotj3s12c/comments'></gd:feedLink></gd:comments><gd:eventStatus value='http://schemas.google.com/g/2005#event.confirmed'></gd:eventStatus><gd:visibility value='http://schemas.google.com/g/2005#event.default'></gd:visibility><gCal:sendEventNotifications value='false'></gCal:sendEventNotifications><gd:transparency value='http://schemas.google.com/g/2005#event.opaque'></gd:transparency><gd:where></gd:where><gd:when startTime='2007-02-09T15:30:00.000-08:00' endTime='2007-02-09T18:00:00.000-08:00'><gd:reminder minutes='10'></gd:reminder></gd:when></entry><entry><id>http://www.google.com/calendar/feeds/default/private/full/gkhb48fj68lcp15fd1k03tjbj0</id><published>2007-02-05T22:04:35.000Z</published><updated>2007-02-05T22:04:35.000Z</updated><category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/g/2005#event'></category><title type='text'>test event 6</title><content type='text'></content><link rel='alternate' type='text/html' href='http://www.google.com/calendar/hosted/voiceme.net/event?eid=Z2toYjQ4Zmo2OGxjcDE1ZmQxazAzdGpiajAgd2dAdm9pY2VtZS5uZXQ' title='alternate'></link><link rel='self' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/gkhb48fj68lcp15fd1k03tjbj0'></link><link rel='edit' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/gkhb48fj68lcp15fd1k03tjbj0/63306396275'></link><author><name>w g</name><email>wg@voiceme.net</email></author><gd:comments><gd:feedLink href='http://www.google.com/calendar/feeds/default/private/full/gkhb48fj68lcp15fd1k03tjbj0/comments'></gd:feedLink></gd:comments><gd:eventStatus value='http://schemas.google.com/g/2005#event.confirmed'></gd:eventStatus><gd:visibility value='http://schemas.google.com/g/2005#event.default'></gd:visibility><gCal:sendEventNotifications value='false'></gCal:sendEventNotifications><gd:transparency value='http://schemas.google.com/g/2005#event.opaque'></gd:transparency><gd:where></gd:where><gd:when startTime='2007-02-10T14:00:00.000-08:00' endTime='2007-02-10T17:00:00.000-08:00'><gd:reminder minutes='10'></gd:reminder></gd:when></entry><entry><id>http://www.google.com/calendar/feeds/default/private/full/32p5g68cpean3p2ol7kanj38sg</id><published>2007-02-05T22:04:29.000Z</published><updated>2007-02-05T22:04:29.000Z</updated><category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/g/2005#event'></category><title type='text'>test event 5</title><content type='text'></content><link rel='alternate' type='text/html' href='http://www.google.com/calendar/hosted/voiceme.net/event?eid=MzJwNWc2OGNwZWFuM3Ayb2w3a2FuajM4c2cgd2dAdm9pY2VtZS5uZXQ' title='alternate'></link><link rel='self' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/32p5g68cpean3p2ol7kanj38sg'></link><link rel='edit' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/32p5g68cpean3p2ol7kanj38sg/63306396269'></link><author><name>w g</name><email>wg@voiceme.net</email></author><gd:comments><gd:feedLink href='http://www.google.com/calendar/feeds/default/private/full/32p5g68cpean3p2ol7kanj38sg/comments'></gd:feedLink></gd:comments><gd:eventStatus value='http://schemas.google.com/g/2005#event.confirmed'></gd:eventStatus><gd:visibility value='http://schemas.google.com/g/2005#event.default'></gd:visibility><gCal:sendEventNotifications value='false'></gCal:sendEventNotifications><gd:transparency value='http://schemas.google.com/g/2005#event.opaque'></gd:transparency><gd:where></gd:where><gd:when startTime='2007-02-09T09:00:00.000-08:00' endTime='2007-02-09T10:30:00.000-08:00'><gd:reminder minutes='10'></gd:reminder></gd:when></entry><entry><id>http://www.google.com/calendar/feeds/default/private/full/tfqpth26conshdmav0apje1tf4</id><published>2007-02-05T22:04:19.000Z</published><updated>2007-02-05T22:04:19.000Z</updated><category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/g/2005#event'></category><title type='text'>skate</title><content type='text'></content><link rel='alternate' type='text/html' href='http://www.google.com/calendar/hosted/voiceme.net/event?eid=dGZxcHRoMjZjb25zaGRtYXYwYXBqZTF0ZjQgd2dAdm9pY2VtZS5uZXQ' title='alternate'></link><link rel='self' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/tfqpth26conshdmav0apje1tf4'></link><link rel='edit' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/tfqpth26conshdmav0apje1tf4/63306396259'></link><author><name>w g</name><email>wg@voiceme.net</email></author><gd:comments><gd:feedLink href='http://www.google.com/calendar/feeds/default/private/full/tfqpth26conshdmav0apje1tf4/comments'></gd:feedLink></gd:comments><gd:eventStatus value='http://schemas.google.com/g/2005#event.confirmed'></gd:eventStatus><gd:visibility value='http://schemas.google.com/g/2005#event.default'></gd:visibility><gCal:sendEventNotifications value='false'></gCal:sendEventNotifications><gd:transparency value='http://schemas.google.com/g/2005#event.opaque'></gd:transparency><gd:where></gd:where><gd:when startTime='2007-02-08T15:00:00.000-08:00' endTime='2007-02-08T17:00:00.000-08:00'><gd:reminder minutes='10'></gd:reminder></gd:when></entry><entry><id>http://www.google.com/calendar/feeds/default/private/full/onbo9mhbr5m6mo356nog7uel4s</id><published>2007-02-05T22:04:07.000Z</published><updated>2007-02-05T22:04:07.000Z</updated><category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/g/2005#event'></category><title type='text'>Sharks at Anaheim</title><content type='text'></content><link rel='alternate' type='text/html' href='http://www.google.com/calendar/hosted/voiceme.net/event?eid=b25ibzltaGJyNW02bW8zNTZub2c3dWVsNHMgd2dAdm9pY2VtZS5uZXQ' title='alternate'></link><link rel='self' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/onbo9mhbr5m6mo356nog7uel4s'></link><link rel='edit' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/onbo9mhbr5m6mo356nog7uel4s/63306396247'></link><author><name>w g</name><email>wg@voiceme.net</email></author><gd:comments><gd:feedLink href='http://www.google.com/calendar/feeds/default/private/full/onbo9mhbr5m6mo356nog7uel4s/comments'></gd:feedLink></gd:comments><gd:eventStatus value='http://schemas.google.com/g/2005#event.confirmed'></gd:eventStatus><gd:visibility value='http://schemas.google.com/g/2005#event.default'></gd:visibility><gCal:sendEventNotifications value='true'></gCal:sendEventNotifications><gd:transparency value='http://schemas.google.com/g/2005#event.opaque'></gd:transparency><gd:where valueString=''></gd:where><gd:when startTime='2007-02-07T19:00:00.000-08:00' endTime='2007-02-07T22:00:00.000-08:00'><gd:reminder minutes='10'></gd:reminder></gd:when></entry><entry><id>http://www.google.com/calendar/feeds/default/private/full/tjqrd9fve576hieh3sa67nql5k</id><published>2007-02-05T22:04:02.000Z</published><updated>2007-02-05T22:04:02.000Z</updated><category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/g/2005#event'></category><title type='text'>Sharks vs. ANAHEIM</title><content type='text'></content><link rel='alternate' type='text/html' href='http://www.google.com/calendar/hosted/voiceme.net/event?eid=dGpxcmQ5ZnZlNTc2aGllaDNzYTY3bnFsNWsgd2dAdm9pY2VtZS5uZXQ' title='alternate'></link><link rel='self' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/tjqrd9fve576hieh3sa67nql5k'></link><link rel='edit' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/tjqrd9fve576hieh3sa67nql5k/63306396242'></link><author><name>w g</name><email>wg@voiceme.net</email></author><gd:comments><gd:feedLink href='http://www.google.com/calendar/feeds/default/private/full/tjqrd9fve576hieh3sa67nql5k/comments'></gd:feedLink></gd:comments><gd:eventStatus value='http://schemas.google.com/g/2005#event.confirmed'></gd:eventStatus><gd:visibility value='http://schemas.google.com/g/2005#event.default'></gd:visibility><gCal:sendEventNotifications value='true'></gCal:sendEventNotifications><gd:transparency value='http://schemas.google.com/g/2005#event.opaque'></gd:transparency><gd:where valueString=''></gd:where><gd:when startTime='2007-02-06T19:30:00.000-08:00' endTime='2007-02-06T22:30:00.000-08:00'><gd:reminder minutes='10'></gd:reminder></gd:when></entry><entry><id>http://www.google.com/calendar/feeds/default/private/full/or6dtpn065f9mntond4jh2docc</id><published>2007-02-05T22:03:52.000Z</published><updated>2007-02-05T22:03:52.000Z</updated><category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/g/2005#event'></category><title type='text'>skate</title><content type='text'></content><link rel='alternate' type='text/html' href='http://www.google.com/calendar/hosted/voiceme.net/event?eid=b3I2ZHRwbjA2NWY5bW50b25kNGpoMmRvY2Mgd2dAdm9pY2VtZS5uZXQ' title='alternate'></link><link rel='self' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/or6dtpn065f9mntond4jh2docc'></link><link rel='edit' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/or6dtpn065f9mntond4jh2docc/63306396232'></link><author><name>w g</name><email>wg@voiceme.net</email></author><gd:comments><gd:feedLink href='http://www.google.com/calendar/feeds/default/private/full/or6dtpn065f9mntond4jh2docc/comments'></gd:feedLink></gd:comments><gd:eventStatus value='http://schemas.google.com/g/2005#event.confirmed'></gd:eventStatus><gd:visibility value='http://schemas.google.com/g/2005#event.default'></gd:visibility><gCal:sendEventNotifications value='false'></gCal:sendEventNotifications><gd:transparency value='http://schemas.google.com/g/2005#event.opaque'></gd:transparency><gd:where></gd:where><gd:when startTime='2007-02-06T14:00:00.000-08:00' endTime='2007-02-06T15:00:00.000-08:00'><gd:reminder minutes='10'></gd:reminder></gd:when></entry><entry><id>http://www.google.com/calendar/feeds/default/private/full/k70v8o4jt1afi17hg2spavq1c0</id><published>2007-02-05T22:03:36.000Z</published><updated>2007-02-05T22:03:36.000Z</updated><category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/g/2005#event'></category><title type='text'>lunch</title><content type='text'></content><link rel='alternate' type='text/html' href='http://www.google.com/calendar/hosted/voiceme.net/event?eid=azcwdjhvNGp0MWFmaTE3aGcyc3BhdnExYzBfMjAwNzAyMDZUMjAwMDAwWiB3Z0B2b2ljZW1lLm5ldA' title='alternate'></link><link rel='self' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/k70v8o4jt1afi17hg2spavq1c0'></link><link rel='edit' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/k70v8o4jt1afi17hg2spavq1c0/63306396216'></link><author><name>w g</name><email>wg@voiceme.net</email></author><gd:eventStatus value='http://schemas.google.com/g/2005#event.confirmed'></gd:eventStatus><gd:visibility value='http://schemas.google.com/g/2005#event.default'></gd:visibility><gCal:sendEventNotifications value='true'></gCal:sendEventNotifications><gd:transparency value='http://schemas.google.com/g/2005#event.opaque'></gd:transparency><gd:recurrence>DTSTART;TZID=America/Los_Angeles:20070206T120000
-DURATION:PT3600S
-RRULE:FREQ=DAILY;WKST=SU
-BEGIN:VTIMEZONE
-TZID:America/Los_Angeles
-X-LIC-LOCATION:America/Los_Angeles
-BEGIN:STANDARD
-TZOFFSETFROM:-0700
-TZOFFSETTO:-0800
-TZNAME:PST
-DTSTART:19701025T020000
-RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
-END:STANDARD
-BEGIN:DAYLIGHT
-TZOFFSETFROM:-0800
-TZOFFSETTO:-0700
-TZNAME:PDT
-DTSTART:19700405T020000
-RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
-END:DAYLIGHT
-END:VTIMEZONE
-</gd:recurrence><gd:where valueString=''></gd:where><gd:reminder minutes='10'></gd:reminder></entry><entry><id>http://www.google.com/calendar/feeds/default/private/full/6ee7b8nohdt03tv0gknm4v7124</id><published>2007-02-05T22:03:19.000Z</published><updated>2007-02-05T22:03:19.000Z</updated><category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/g/2005#event'></category><title type='text'>test event 4</title><content type='text'></content><link rel='alternate' type='text/html' href='http://www.google.com/calendar/hosted/voiceme.net/event?eid=NmVlN2I4bm9oZHQwM3R2MGdrbm00djcxMjQgd2dAdm9pY2VtZS5uZXQ' title='alternate'></link><link rel='self' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/6ee7b8nohdt03tv0gknm4v7124'></link><link rel='edit' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/6ee7b8nohdt03tv0gknm4v7124/63306396199'></link><author><name>w g</name><email>wg@voiceme.net</email></author><gd:comments><gd:feedLink href='http://www.google.com/calendar/feeds/default/private/full/6ee7b8nohdt03tv0gknm4v7124/comments'></gd:feedLink></gd:comments><gd:eventStatus value='http://schemas.google.com/g/2005#event.confirmed'></gd:eventStatus><gd:visibility value='http://schemas.google.com/g/2005#event.default'></gd:visibility><gCal:sendEventNotifications value='false'></gCal:sendEventNotifications><gd:transparency value='http://schemas.google.com/g/2005#event.opaque'></gd:transparency><gd:where></gd:where><gd:when startTime='2007-02-06T09:00:00.000-08:00' endTime='2007-02-06T11:00:00.000-08:00'><gd:reminder minutes='10'></gd:reminder></gd:when></entry><entry><id>http://www.google.com/calendar/feeds/default/private/full/of1vh1r2q5aqdplo65i8bqbn3o</id><published>2007-02-05T22:03:11.000Z</published><updated>2007-02-05T22:03:11.000Z</updated><category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/g/2005#event'></category><title type='text'>test event 3</title><content type='text'></content><link rel='alternate' type='text/html' href='http://www.google.com/calendar/hosted/voiceme.net/event?eid=b2YxdmgxcjJxNWFxZHBsbzY1aThicWJuM28gd2dAdm9pY2VtZS5uZXQ' title='alternate'></link><link rel='self' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/of1vh1r2q5aqdplo65i8bqbn3o'></link><link rel='edit' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/of1vh1r2q5aqdplo65i8bqbn3o/63306396191'></link><author><name>w g</name><email>wg@voiceme.net</email></author><gd:comments><gd:feedLink href='http://www.google.com/calendar/feeds/default/private/full/of1vh1r2q5aqdplo65i8bqbn3o/comments'></gd:feedLink></gd:comments><gd:eventStatus value='http://schemas.google.com/g/2005#event.confirmed'></gd:eventStatus><gd:visibility value='http://schemas.google.com/g/2005#event.default'></gd:visibility><gCal:sendEventNotifications value='false'></gCal:sendEventNotifications><gd:transparency value='http://schemas.google.com/g/2005#event.opaque'></gd:transparency><gd:where></gd:where><gd:when startTime='2007-02-05T18:00:00.000-08:00' endTime='2007-02-05T19:00:00.000-08:00'><gd:reminder minutes='10'></gd:reminder></gd:when></entry><entry><id>http://www.google.com/calendar/feeds/default/private/full/s7ahgfomlgii9qbkgpfbinr9u8</id><published>2007-02-05T22:02:40.000Z</published><updated>2007-02-05T22:03:04.000Z</updated><category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/g/2005#event'></category><title type='text'>test event 2</title><content type='text'></content><link rel='alternate' type='text/html' href='http://www.google.com/calendar/hosted/voiceme.net/event?eid=czdhaGdmb21sZ2lpOXFia2dwZmJpbnI5dTggd2dAdm9pY2VtZS5uZXQ' title='alternate'></link><link rel='self' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/s7ahgfomlgii9qbkgpfbinr9u8'></link><link rel='edit' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/s7ahgfomlgii9qbkgpfbinr9u8/63306396184'></link><author><name>w g</name><email>wg@voiceme.net</email></author><gd:comments><gd:feedLink href='http://www.google.com/calendar/feeds/default/private/full/s7ahgfomlgii9qbkgpfbinr9u8/comments'></gd:feedLink></gd:comments><gd:eventStatus value='http://schemas.google.com/g/2005#event.confirmed'></gd:eventStatus><gd:visibility value='http://schemas.google.com/g/2005#event.default'></gd:visibility><gCal:sendEventNotifications value='false'></gCal:sendEventNotifications><gd:transparency value='http://schemas.google.com/g/2005#event.opaque'></gd:transparency><gd:where valueString=''></gd:where><gd:when startTime='2007-02-05T16:30:00.000-08:00' endTime='2007-02-05T17:30:00.000-08:00'><gd:reminder minutes='10'></gd:reminder></gd:when></entry><entry><id>http://www.google.com/calendar/feeds/default/private/full/rl8focglfe6jndql4u8lg73q5k</id><published>2007-02-05T22:02:28.000Z</published><updated>2007-02-05T22:02:53.000Z</updated><category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/g/2005#event'></category><title type='text'>test event 1</title><content type='text'></content><link rel='alternate' type='text/html' href='http://www.google.com/calendar/hosted/voiceme.net/event?eid=cmw4Zm9jZ2xmZTZqbmRxbDR1OGxnNzNxNWsgd2dAdm9pY2VtZS5uZXQ' title='alternate'></link><link rel='self' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/rl8focglfe6jndql4u8lg73q5k'></link><link rel='edit' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/rl8focglfe6jndql4u8lg73q5k/63306396173'></link><author><name>w g</name><email>wg@voiceme.net</email></author><gd:comments><gd:feedLink href='http://www.google.com/calendar/feeds/default/private/full/rl8focglfe6jndql4u8lg73q5k/comments'></gd:feedLink></gd:comments><gd:eventStatus value='http://schemas.google.com/g/2005#event.confirmed'></gd:eventStatus><gd:visibility value='http://schemas.google.com/g/2005#event.default'></gd:visibility><gCal:sendEventNotifications value='false'></gCal:sendEventNotifications><gd:transparency value='http://schemas.google.com/g/2005#event.opaque'></gd:transparency><gd:where></gd:where><gd:when startTime='2007-02-05T15:00:00.000-08:00' endTime='2007-02-05T16:00:00.000-08:00'><gd:reminder minutes='10'></gd:reminder></gd:when></entry></feed>
diff --git a/tests/AndroidTests/res/raw/calendarxmlgz.xmlgz b/tests/AndroidTests/res/raw/calendarxmlgz.xmlgz
deleted file mode 100644
index 6c86462..0000000
--- a/tests/AndroidTests/res/raw/calendarxmlgz.xmlgz
+++ /dev/null
Binary files differ
diff --git a/tests/AndroidTests/res/xml/calendar.xml b/tests/AndroidTests/res/xml/calendar.xml
deleted file mode 100644
index 1adcd74..0000000
--- a/tests/AndroidTests/res/xml/calendar.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:gd='http://schemas.google.com/g/2005' xmlns:gCal='http://schemas.google.com/gCal/2005'><id>http://www.google.com/calendar/feeds/default/private/full</id><updated>2007-02-05T22:04:50.000Z</updated><category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/g/2005#event'></category><title type='text'>w g</title><subtitle type='text'>w g</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full'></link><link rel='http://schemas.google.com/g/2005#post' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full'></link><link rel='self' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full?max-results=25'></link><author><name>w g</name><email>wg@voiceme.net</email></author><generator version='1.0' uri='http://www.google.com/calendar'>Google Calendar</generator><openSearch:totalResults>13</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><gCal:timezone value='America/Los_Angeles'></gCal:timezone><entry><id>http://www.google.com/calendar/feeds/default/private/full/7iqc1ro0ihc69vhsiq3uabooig</id><published>2007-02-05T22:04:50.000Z</published><updated>2007-02-05T22:04:50.000Z</updated><category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/g/2005#event'></category><title type='text'>skate</title><content type='text'></content><link rel='alternate' type='text/html' href='http://www.google.com/calendar/hosted/voiceme.net/event?eid=N2lxYzFybzBpaGM2OXZoc2lxM3VhYm9vaWcgd2dAdm9pY2VtZS5uZXQ' title='alternate'></link><link rel='self' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/7iqc1ro0ihc69vhsiq3uabooig'></link><link rel='edit' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/7iqc1ro0ihc69vhsiq3uabooig/63306396290'></link><author><name>w g</name><email>wg@voiceme.net</email></author><gd:comments><gd:feedLink href='http://www.google.com/calendar/feeds/default/private/full/7iqc1ro0ihc69vhsiq3uabooig/comments'></gd:feedLink></gd:comments><gd:eventStatus value='http://schemas.google.com/g/2005#event.confirmed'></gd:eventStatus><gd:visibility value='http://schemas.google.com/g/2005#event.default'></gd:visibility><gCal:sendEventNotifications value='false'></gCal:sendEventNotifications><gd:transparency value='http://schemas.google.com/g/2005#event.opaque'></gd:transparency><gd:where></gd:where><gd:when startTime='2007-02-07T13:30:00.000-08:00' endTime='2007-02-07T16:00:00.000-08:00'><gd:reminder minutes='10'></gd:reminder></gd:when></entry><entry><id>http://www.google.com/calendar/feeds/default/private/full/kp4gil76n2vcrkt9kaotj3s12c</id><published>2007-02-05T22:04:42.000Z</published><updated>2007-02-05T22:04:42.000Z</updated><category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/g/2005#event'></category><title type='text'>skate</title><content type='text'></content><link rel='alternate' type='text/html' href='http://www.google.com/calendar/hosted/voiceme.net/event?eid=a3A0Z2lsNzZuMnZjcmt0OWthb3RqM3MxMmMgd2dAdm9pY2VtZS5uZXQ' title='alternate'></link><link rel='self' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/kp4gil76n2vcrkt9kaotj3s12c'></link><link rel='edit' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/kp4gil76n2vcrkt9kaotj3s12c/63306396282'></link><author><name>w g</name><email>wg@voiceme.net</email></author><gd:comments><gd:feedLink href='http://www.google.com/calendar/feeds/default/private/full/kp4gil76n2vcrkt9kaotj3s12c/comments'></gd:feedLink></gd:comments><gd:eventStatus value='http://schemas.google.com/g/2005#event.confirmed'></gd:eventStatus><gd:visibility value='http://schemas.google.com/g/2005#event.default'></gd:visibility><gCal:sendEventNotifications value='false'></gCal:sendEventNotifications><gd:transparency value='http://schemas.google.com/g/2005#event.opaque'></gd:transparency><gd:where></gd:where><gd:when startTime='2007-02-09T15:30:00.000-08:00' endTime='2007-02-09T18:00:00.000-08:00'><gd:reminder minutes='10'></gd:reminder></gd:when></entry><entry><id>http://www.google.com/calendar/feeds/default/private/full/gkhb48fj68lcp15fd1k03tjbj0</id><published>2007-02-05T22:04:35.000Z</published><updated>2007-02-05T22:04:35.000Z</updated><category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/g/2005#event'></category><title type='text'>test event 6</title><content type='text'></content><link rel='alternate' type='text/html' href='http://www.google.com/calendar/hosted/voiceme.net/event?eid=Z2toYjQ4Zmo2OGxjcDE1ZmQxazAzdGpiajAgd2dAdm9pY2VtZS5uZXQ' title='alternate'></link><link rel='self' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/gkhb48fj68lcp15fd1k03tjbj0'></link><link rel='edit' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/gkhb48fj68lcp15fd1k03tjbj0/63306396275'></link><author><name>w g</name><email>wg@voiceme.net</email></author><gd:comments><gd:feedLink href='http://www.google.com/calendar/feeds/default/private/full/gkhb48fj68lcp15fd1k03tjbj0/comments'></gd:feedLink></gd:comments><gd:eventStatus value='http://schemas.google.com/g/2005#event.confirmed'></gd:eventStatus><gd:visibility value='http://schemas.google.com/g/2005#event.default'></gd:visibility><gCal:sendEventNotifications value='false'></gCal:sendEventNotifications><gd:transparency value='http://schemas.google.com/g/2005#event.opaque'></gd:transparency><gd:where></gd:where><gd:when startTime='2007-02-10T14:00:00.000-08:00' endTime='2007-02-10T17:00:00.000-08:00'><gd:reminder minutes='10'></gd:reminder></gd:when></entry><entry><id>http://www.google.com/calendar/feeds/default/private/full/32p5g68cpean3p2ol7kanj38sg</id><published>2007-02-05T22:04:29.000Z</published><updated>2007-02-05T22:04:29.000Z</updated><category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/g/2005#event'></category><title type='text'>test event 5</title><content type='text'></content><link rel='alternate' type='text/html' href='http://www.google.com/calendar/hosted/voiceme.net/event?eid=MzJwNWc2OGNwZWFuM3Ayb2w3a2FuajM4c2cgd2dAdm9pY2VtZS5uZXQ' title='alternate'></link><link rel='self' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/32p5g68cpean3p2ol7kanj38sg'></link><link rel='edit' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/32p5g68cpean3p2ol7kanj38sg/63306396269'></link><author><name>w g</name><email>wg@voiceme.net</email></author><gd:comments><gd:feedLink href='http://www.google.com/calendar/feeds/default/private/full/32p5g68cpean3p2ol7kanj38sg/comments'></gd:feedLink></gd:comments><gd:eventStatus value='http://schemas.google.com/g/2005#event.confirmed'></gd:eventStatus><gd:visibility value='http://schemas.google.com/g/2005#event.default'></gd:visibility><gCal:sendEventNotifications value='false'></gCal:sendEventNotifications><gd:transparency value='http://schemas.google.com/g/2005#event.opaque'></gd:transparency><gd:where></gd:where><gd:when startTime='2007-02-09T09:00:00.000-08:00' endTime='2007-02-09T10:30:00.000-08:00'><gd:reminder minutes='10'></gd:reminder></gd:when></entry><entry><id>http://www.google.com/calendar/feeds/default/private/full/tfqpth26conshdmav0apje1tf4</id><published>2007-02-05T22:04:19.000Z</published><updated>2007-02-05T22:04:19.000Z</updated><category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/g/2005#event'></category><title type='text'>skate</title><content type='text'></content><link rel='alternate' type='text/html' href='http://www.google.com/calendar/hosted/voiceme.net/event?eid=dGZxcHRoMjZjb25zaGRtYXYwYXBqZTF0ZjQgd2dAdm9pY2VtZS5uZXQ' title='alternate'></link><link rel='self' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/tfqpth26conshdmav0apje1tf4'></link><link rel='edit' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/tfqpth26conshdmav0apje1tf4/63306396259'></link><author><name>w g</name><email>wg@voiceme.net</email></author><gd:comments><gd:feedLink href='http://www.google.com/calendar/feeds/default/private/full/tfqpth26conshdmav0apje1tf4/comments'></gd:feedLink></gd:comments><gd:eventStatus value='http://schemas.google.com/g/2005#event.confirmed'></gd:eventStatus><gd:visibility value='http://schemas.google.com/g/2005#event.default'></gd:visibility><gCal:sendEventNotifications value='false'></gCal:sendEventNotifications><gd:transparency value='http://schemas.google.com/g/2005#event.opaque'></gd:transparency><gd:where></gd:where><gd:when startTime='2007-02-08T15:00:00.000-08:00' endTime='2007-02-08T17:00:00.000-08:00'><gd:reminder minutes='10'></gd:reminder></gd:when></entry><entry><id>http://www.google.com/calendar/feeds/default/private/full/onbo9mhbr5m6mo356nog7uel4s</id><published>2007-02-05T22:04:07.000Z</published><updated>2007-02-05T22:04:07.000Z</updated><category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/g/2005#event'></category><title type='text'>Sharks at Anaheim</title><content type='text'></content><link rel='alternate' type='text/html' href='http://www.google.com/calendar/hosted/voiceme.net/event?eid=b25ibzltaGJyNW02bW8zNTZub2c3dWVsNHMgd2dAdm9pY2VtZS5uZXQ' title='alternate'></link><link rel='self' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/onbo9mhbr5m6mo356nog7uel4s'></link><link rel='edit' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/onbo9mhbr5m6mo356nog7uel4s/63306396247'></link><author><name>w g</name><email>wg@voiceme.net</email></author><gd:comments><gd:feedLink href='http://www.google.com/calendar/feeds/default/private/full/onbo9mhbr5m6mo356nog7uel4s/comments'></gd:feedLink></gd:comments><gd:eventStatus value='http://schemas.google.com/g/2005#event.confirmed'></gd:eventStatus><gd:visibility value='http://schemas.google.com/g/2005#event.default'></gd:visibility><gCal:sendEventNotifications value='true'></gCal:sendEventNotifications><gd:transparency value='http://schemas.google.com/g/2005#event.opaque'></gd:transparency><gd:where valueString=''></gd:where><gd:when startTime='2007-02-07T19:00:00.000-08:00' endTime='2007-02-07T22:00:00.000-08:00'><gd:reminder minutes='10'></gd:reminder></gd:when></entry><entry><id>http://www.google.com/calendar/feeds/default/private/full/tjqrd9fve576hieh3sa67nql5k</id><published>2007-02-05T22:04:02.000Z</published><updated>2007-02-05T22:04:02.000Z</updated><category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/g/2005#event'></category><title type='text'>Sharks vs. ANAHEIM</title><content type='text'></content><link rel='alternate' type='text/html' href='http://www.google.com/calendar/hosted/voiceme.net/event?eid=dGpxcmQ5ZnZlNTc2aGllaDNzYTY3bnFsNWsgd2dAdm9pY2VtZS5uZXQ' title='alternate'></link><link rel='self' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/tjqrd9fve576hieh3sa67nql5k'></link><link rel='edit' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/tjqrd9fve576hieh3sa67nql5k/63306396242'></link><author><name>w g</name><email>wg@voiceme.net</email></author><gd:comments><gd:feedLink href='http://www.google.com/calendar/feeds/default/private/full/tjqrd9fve576hieh3sa67nql5k/comments'></gd:feedLink></gd:comments><gd:eventStatus value='http://schemas.google.com/g/2005#event.confirmed'></gd:eventStatus><gd:visibility value='http://schemas.google.com/g/2005#event.default'></gd:visibility><gCal:sendEventNotifications value='true'></gCal:sendEventNotifications><gd:transparency value='http://schemas.google.com/g/2005#event.opaque'></gd:transparency><gd:where valueString=''></gd:where><gd:when startTime='2007-02-06T19:30:00.000-08:00' endTime='2007-02-06T22:30:00.000-08:00'><gd:reminder minutes='10'></gd:reminder></gd:when></entry><entry><id>http://www.google.com/calendar/feeds/default/private/full/or6dtpn065f9mntond4jh2docc</id><published>2007-02-05T22:03:52.000Z</published><updated>2007-02-05T22:03:52.000Z</updated><category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/g/2005#event'></category><title type='text'>skate</title><content type='text'></content><link rel='alternate' type='text/html' href='http://www.google.com/calendar/hosted/voiceme.net/event?eid=b3I2ZHRwbjA2NWY5bW50b25kNGpoMmRvY2Mgd2dAdm9pY2VtZS5uZXQ' title='alternate'></link><link rel='self' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/or6dtpn065f9mntond4jh2docc'></link><link rel='edit' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/or6dtpn065f9mntond4jh2docc/63306396232'></link><author><name>w g</name><email>wg@voiceme.net</email></author><gd:comments><gd:feedLink href='http://www.google.com/calendar/feeds/default/private/full/or6dtpn065f9mntond4jh2docc/comments'></gd:feedLink></gd:comments><gd:eventStatus value='http://schemas.google.com/g/2005#event.confirmed'></gd:eventStatus><gd:visibility value='http://schemas.google.com/g/2005#event.default'></gd:visibility><gCal:sendEventNotifications value='false'></gCal:sendEventNotifications><gd:transparency value='http://schemas.google.com/g/2005#event.opaque'></gd:transparency><gd:where></gd:where><gd:when startTime='2007-02-06T14:00:00.000-08:00' endTime='2007-02-06T15:00:00.000-08:00'><gd:reminder minutes='10'></gd:reminder></gd:when></entry><entry><id>http://www.google.com/calendar/feeds/default/private/full/k70v8o4jt1afi17hg2spavq1c0</id><published>2007-02-05T22:03:36.000Z</published><updated>2007-02-05T22:03:36.000Z</updated><category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/g/2005#event'></category><title type='text'>lunch</title><content type='text'></content><link rel='alternate' type='text/html' href='http://www.google.com/calendar/hosted/voiceme.net/event?eid=azcwdjhvNGp0MWFmaTE3aGcyc3BhdnExYzBfMjAwNzAyMDZUMjAwMDAwWiB3Z0B2b2ljZW1lLm5ldA' title='alternate'></link><link rel='self' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/k70v8o4jt1afi17hg2spavq1c0'></link><link rel='edit' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/k70v8o4jt1afi17hg2spavq1c0/63306396216'></link><author><name>w g</name><email>wg@voiceme.net</email></author><gd:eventStatus value='http://schemas.google.com/g/2005#event.confirmed'></gd:eventStatus><gd:visibility value='http://schemas.google.com/g/2005#event.default'></gd:visibility><gCal:sendEventNotifications value='true'></gCal:sendEventNotifications><gd:transparency value='http://schemas.google.com/g/2005#event.opaque'></gd:transparency><gd:recurrence>DTSTART;TZID=America/Los_Angeles:20070206T120000
-DURATION:PT3600S
-RRULE:FREQ=DAILY;WKST=SU
-BEGIN:VTIMEZONE
-TZID:America/Los_Angeles
-X-LIC-LOCATION:America/Los_Angeles
-BEGIN:STANDARD
-TZOFFSETFROM:-0700
-TZOFFSETTO:-0800
-TZNAME:PST
-DTSTART:19701025T020000
-RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
-END:STANDARD
-BEGIN:DAYLIGHT
-TZOFFSETFROM:-0800
-TZOFFSETTO:-0700
-TZNAME:PDT
-DTSTART:19700405T020000
-RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
-END:DAYLIGHT
-END:VTIMEZONE
-</gd:recurrence><gd:where valueString=''></gd:where><gd:reminder minutes='10'></gd:reminder></entry><entry><id>http://www.google.com/calendar/feeds/default/private/full/6ee7b8nohdt03tv0gknm4v7124</id><published>2007-02-05T22:03:19.000Z</published><updated>2007-02-05T22:03:19.000Z</updated><category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/g/2005#event'></category><title type='text'>test event 4</title><content type='text'></content><link rel='alternate' type='text/html' href='http://www.google.com/calendar/hosted/voiceme.net/event?eid=NmVlN2I4bm9oZHQwM3R2MGdrbm00djcxMjQgd2dAdm9pY2VtZS5uZXQ' title='alternate'></link><link rel='self' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/6ee7b8nohdt03tv0gknm4v7124'></link><link rel='edit' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/6ee7b8nohdt03tv0gknm4v7124/63306396199'></link><author><name>w g</name><email>wg@voiceme.net</email></author><gd:comments><gd:feedLink href='http://www.google.com/calendar/feeds/default/private/full/6ee7b8nohdt03tv0gknm4v7124/comments'></gd:feedLink></gd:comments><gd:eventStatus value='http://schemas.google.com/g/2005#event.confirmed'></gd:eventStatus><gd:visibility value='http://schemas.google.com/g/2005#event.default'></gd:visibility><gCal:sendEventNotifications value='false'></gCal:sendEventNotifications><gd:transparency value='http://schemas.google.com/g/2005#event.opaque'></gd:transparency><gd:where></gd:where><gd:when startTime='2007-02-06T09:00:00.000-08:00' endTime='2007-02-06T11:00:00.000-08:00'><gd:reminder minutes='10'></gd:reminder></gd:when></entry><entry><id>http://www.google.com/calendar/feeds/default/private/full/of1vh1r2q5aqdplo65i8bqbn3o</id><published>2007-02-05T22:03:11.000Z</published><updated>2007-02-05T22:03:11.000Z</updated><category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/g/2005#event'></category><title type='text'>test event 3</title><content type='text'></content><link rel='alternate' type='text/html' href='http://www.google.com/calendar/hosted/voiceme.net/event?eid=b2YxdmgxcjJxNWFxZHBsbzY1aThicWJuM28gd2dAdm9pY2VtZS5uZXQ' title='alternate'></link><link rel='self' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/of1vh1r2q5aqdplo65i8bqbn3o'></link><link rel='edit' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/of1vh1r2q5aqdplo65i8bqbn3o/63306396191'></link><author><name>w g</name><email>wg@voiceme.net</email></author><gd:comments><gd:feedLink href='http://www.google.com/calendar/feeds/default/private/full/of1vh1r2q5aqdplo65i8bqbn3o/comments'></gd:feedLink></gd:comments><gd:eventStatus value='http://schemas.google.com/g/2005#event.confirmed'></gd:eventStatus><gd:visibility value='http://schemas.google.com/g/2005#event.default'></gd:visibility><gCal:sendEventNotifications value='false'></gCal:sendEventNotifications><gd:transparency value='http://schemas.google.com/g/2005#event.opaque'></gd:transparency><gd:where></gd:where><gd:when startTime='2007-02-05T18:00:00.000-08:00' endTime='2007-02-05T19:00:00.000-08:00'><gd:reminder minutes='10'></gd:reminder></gd:when></entry><entry><id>http://www.google.com/calendar/feeds/default/private/full/s7ahgfomlgii9qbkgpfbinr9u8</id><published>2007-02-05T22:02:40.000Z</published><updated>2007-02-05T22:03:04.000Z</updated><category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/g/2005#event'></category><title type='text'>test event 2</title><content type='text'></content><link rel='alternate' type='text/html' href='http://www.google.com/calendar/hosted/voiceme.net/event?eid=czdhaGdmb21sZ2lpOXFia2dwZmJpbnI5dTggd2dAdm9pY2VtZS5uZXQ' title='alternate'></link><link rel='self' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/s7ahgfomlgii9qbkgpfbinr9u8'></link><link rel='edit' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/s7ahgfomlgii9qbkgpfbinr9u8/63306396184'></link><author><name>w g</name><email>wg@voiceme.net</email></author><gd:comments><gd:feedLink href='http://www.google.com/calendar/feeds/default/private/full/s7ahgfomlgii9qbkgpfbinr9u8/comments'></gd:feedLink></gd:comments><gd:eventStatus value='http://schemas.google.com/g/2005#event.confirmed'></gd:eventStatus><gd:visibility value='http://schemas.google.com/g/2005#event.default'></gd:visibility><gCal:sendEventNotifications value='false'></gCal:sendEventNotifications><gd:transparency value='http://schemas.google.com/g/2005#event.opaque'></gd:transparency><gd:where valueString=''></gd:where><gd:when startTime='2007-02-05T16:30:00.000-08:00' endTime='2007-02-05T17:30:00.000-08:00'><gd:reminder minutes='10'></gd:reminder></gd:when></entry><entry><id>http://www.google.com/calendar/feeds/default/private/full/rl8focglfe6jndql4u8lg73q5k</id><published>2007-02-05T22:02:28.000Z</published><updated>2007-02-05T22:02:53.000Z</updated><category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/g/2005#event'></category><title type='text'>test event 1</title><content type='text'></content><link rel='alternate' type='text/html' href='http://www.google.com/calendar/hosted/voiceme.net/event?eid=cmw4Zm9jZ2xmZTZqbmRxbDR1OGxnNzNxNWsgd2dAdm9pY2VtZS5uZXQ' title='alternate'></link><link rel='self' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/rl8focglfe6jndql4u8lg73q5k'></link><link rel='edit' type='application/atom+xml' href='http://www.google.com/calendar/feeds/default/private/full/rl8focglfe6jndql4u8lg73q5k/63306396173'></link><author><name>w g</name><email>wg@voiceme.net</email></author><gd:comments><gd:feedLink href='http://www.google.com/calendar/feeds/default/private/full/rl8focglfe6jndql4u8lg73q5k/comments'></gd:feedLink></gd:comments><gd:eventStatus value='http://schemas.google.com/g/2005#event.confirmed'></gd:eventStatus><gd:visibility value='http://schemas.google.com/g/2005#event.default'></gd:visibility><gCal:sendEventNotifications value='false'></gCal:sendEventNotifications><gd:transparency value='http://schemas.google.com/g/2005#event.opaque'></gd:transparency><gd:where></gd:where><gd:when startTime='2007-02-05T15:00:00.000-08:00' endTime='2007-02-05T16:00:00.000-08:00'><gd:reminder minutes='10'></gd:reminder></gd:when></entry></feed>
diff --git a/tests/AndroidTests/src/com/android/unit_tests/GDataParseTest.java b/tests/AndroidTests/src/com/android/unit_tests/GDataParseTest.java
deleted file mode 100644
index af85483..0000000
--- a/tests/AndroidTests/src/com/android/unit_tests/GDataParseTest.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Copyright (C) 2006 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.unit_tests;
-
-import android.content.res.XmlResourceParser;
-import android.test.AndroidTestCase;
-import android.test.PerformanceTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.SmallTest;
-import android.util.Xml;
-import com.google.wireless.gdata.data.Entry;
-import com.google.wireless.gdata.data.Feed;
-import com.google.wireless.gdata.parser.ParseException;
-import com.google.wireless.gdata.parser.xml.XmlGDataParser;
-import org.json.JSONObject;
-import org.json.JSONTokener;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.zip.GZIPInputStream;
-
-/**
- * Tests timing on parsing various formats of GData.
- */
-public class GDataParseTest extends AndroidTestCase implements PerformanceTestCase {
-
-    private static void parseXml(InputStream is) throws ParseException, IOException {
-        XmlPullParser xmlParser = Xml.newPullParser();
-        XmlGDataParser parser = new XmlGDataParser(is, xmlParser);
-        Feed feed = parser.init();
-        Entry entry = null;
-        while (parser.hasMoreData()) {
-            entry = parser.readNextEntry(entry);
-        }
-    }
-
-    private static void parseXml(XmlPullParser xmlP) throws ParseException, IOException {
-        XmlGDataParser parser = new XmlGDataParser(null /* in */, xmlP);
-        Feed feed = parser.init();
-        Entry entry = null;
-        while (parser.hasMoreData()) {
-            entry = parser.readNextEntry(entry);
-        }
-    }
-
-    private static void dumpXml(XmlPullParser parser) throws
-            XmlPullParserException, IOException {
-        int eventType = parser.nextTag();
-        while (eventType != XmlPullParser.END_DOCUMENT) {
-            switch (eventType) {
-                case XmlPullParser.START_TAG:
-                    parser.getName();
-                    // System.out.print("<" + parser.getName());
-                    int nattrs = parser.getAttributeCount();
-                    for (int i = 0; i < nattrs; ++i) {
-                        parser.getAttributeName(i);
-                        parser.getAttributeValue(i);
-                        // System.out.print(" " + parser.getAttributeName(i) + "=\""
-                        //        + parser.getAttributeValue(i) + "\"");
-                    }
-                    // System.out.print(">");
-                    break;
-                case XmlPullParser.END_TAG:
-                    parser.getName();
-                    // System.out.print("</" + parser.getName() + ">");
-                    break;
-                case XmlPullParser.TEXT:
-                    parser.getText();
-                    // System.out.print(parser.getText());
-                    break;
-                default:
-                    // do nothing
-            }
-            eventType = parser.next();
-        }
-    }
-
-    private byte[] getBytesForResource(int resid) throws Exception {
-        // all resources are written into a zip file, so the InputStream we
-        // get for a resource is on top of zipped
-        // data.  in order to compare performance of parsing unzipped vs.
-        // zipped content, we first read the data into an in-memory buffer.
-        InputStream zipIs = null;
-        try {
-            zipIs = mContext.getResources().openRawResource(resid);
-            ByteArrayOutputStream baos = new ByteArrayOutputStream();
-            byte buf[] = new byte[1024];
-            int bytesRead = zipIs.read(buf);
-            while (bytesRead > 0) {
-                baos.write(buf, 0, bytesRead);
-                bytesRead = zipIs.read(buf);
-            }
-            return baos.toByteArray();
-        } finally {
-            if (zipIs != null) {
-                zipIs.close();
-            }
-        }
-    }
-
-    public boolean isPerformanceOnly() {
-        return true;
-    }
-
-    public int startPerformance(PerformanceTestCase.Intermediates intermediates) {
-        return 0;
-    }
-
-    @MediumTest
-    public void testXml() throws Exception {
-        InputStream is = new ByteArrayInputStream(getBytesForResource(R.raw.calendarxml));
-        try {
-            is.reset();
-            parseXml(is);
-        } finally {
-            is.close();
-        }
-    }
-
-    @MediumTest
-    public void testXmlGzip() throws Exception {
-        InputStream gzIs = new GZIPInputStream(
-                new ByteArrayInputStream(getBytesForResource(R.raw.calendarxmlgz)));
-        try {
-            parseXml(gzIs);
-        } finally {
-            gzIs.close();
-        }
-    }
-
-    @MediumTest
-    public void testJson() throws Exception {
-        String jsonString = new String(getBytesForResource(R.raw.calendarjs), "UTF-8");
-        JSONTokener tokens = new JSONTokener(jsonString);
-        assertNotNull(new JSONObject(tokens));
-    }
-
-    @SmallTest
-    public void testBinaryXml() throws Exception {
-        XmlResourceParser parser = mContext.getResources().getXml(R.xml.calendar);
-        parseXml(parser);
-        parser.close();
-    }
-}
