diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index c7a9feb..5a4b2b3 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -50,19 +50,5 @@
                 <action android:name="android.intent.action.BOOT_COMPLETED" />
             </intent-filter>
         </receiver>
-        <receiver android:name=".CalendarGadgetProvider" android:label="@string/gadget_title">
-            <intent-filter>
-                <action android:name="android.gadget.action.GADGET_UPDATE" />
-                <action android:name="com.android.calendar.GADGET_UPDATE" />
-            </intent-filter>
-            <meta-data android:name="android.gadget.provider" android:resource="@xml/gadget_info" />
-        </receiver>
-        <receiver android:name=".TimeChangeReceiver" android:enabled="false">
-            <intent-filter>
-                <action android:name="android.intent.action.TIMEZONE_CHANGED" />
-                <action android:name="android.intent.action.TIME_SET" />
-                <action android:name="android.intent.action.DATE_CHANGED" />
-            </intent-filter>
-        </receiver>
     </application>
 </manifest>
diff --git a/res/drawable/app_icon_blank.png b/res/drawable/app_icon_blank.png
deleted file mode 100644
index 78e4008..0000000
--- a/res/drawable/app_icon_blank.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/bg_calendar.9.png b/res/drawable/bg_calendar.9.png
deleted file mode 100644
index 7e9c624..0000000
--- a/res/drawable/bg_calendar.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/bg_calendar_primary.9.png b/res/drawable/bg_calendar_primary.9.png
deleted file mode 100644
index 8c3a7c7..0000000
--- a/res/drawable/bg_calendar_primary.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/gadget_date_bg.9.png b/res/drawable/gadget_date_bg.9.png
deleted file mode 100644
index abf4c44..0000000
--- a/res/drawable/gadget_date_bg.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/strip_cal.9.png b/res/drawable/strip_cal.9.png
deleted file mode 100644
index f4cc88d..0000000
--- a/res/drawable/strip_cal.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/strip_cal_secondary.9.png b/res/drawable/strip_cal_secondary.9.png
deleted file mode 100644
index acddde0..0000000
--- a/res/drawable/strip_cal_secondary.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/white_list_rule_cal.9.png b/res/drawable/white_list_rule_cal.9.png
deleted file mode 100644
index 0b175a3..0000000
--- a/res/drawable/white_list_rule_cal.9.png
+++ /dev/null
Binary files differ
diff --git a/res/layout-land/gadget_item.xml b/res/layout-land/gadget_item.xml
deleted file mode 100644
index d63eb44..0000000
--- a/res/layout-land/gadget_item.xml
+++ /dev/null
@@ -1,182 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2009 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.
--->
-
-
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/gadget"
-    android:layout_width="fill_parent"
-    android:layout_height="wrap_content"
-    android:paddingBottom="6dip"
-    android:background="@drawable/bg_calendar"
-    >
-
-    <TextView
-        android:id="@+id/no_events"
-        android:layout_width="fill_parent"
-        android:layout_height="fill_parent"
-        android:paddingTop="6dip"
-        android:gravity="center"
-        android:textStyle="bold"
-        android:textSize="16sp"
-        android:text="@string/gadget_no_events"
-        android:textColor="@color/gadget_no_events"
-        />
-
-    <FrameLayout
-        android:id="@+id/landscape_hidden"
-        android:layout_width="0dip"
-        android:layout_height="0dip"
-        android:visibility="gone"
-        >
-
-        <TextView
-            android:id="@+id/secondary_card"
-            android:layout_width="0dip"
-            android:layout_height="0dip"
-            />
-
-        <TextView
-            android:id="@+id/stub_when"
-            android:layout_width="0dip"
-            android:layout_height="0dip"
-            />
-
-        <TextView
-            android:id="@+id/stub_title"
-            android:layout_width="0dip"
-            android:layout_height="0dip"
-            />
-
-        <TextView
-            android:id="@+id/stub_where"
-            android:layout_width="0dip"
-            android:layout_height="0dip"
-            />
-
-        <TextView
-            android:id="@+id/secondary_when"
-            android:layout_width="0dip"
-            android:layout_height="0dip"
-            android:background="@drawable/strip_cal_secondary"
-            />
-
-        <TextView
-            android:id="@+id/secondary_title"
-            android:layout_width="0dip"
-            android:layout_height="0dip"
-            />
-
-        <ImageView
-            android:id="@+id/divider"
-            android:layout_width="0dip"
-            android:layout_height="0dip"
-            android:background="@drawable/white_list_rule_cal"
-            />
-
-        <TextView
-            android:id="@+id/title2"
-            android:layout_width="0dip"
-            android:layout_height="0dip"
-            />
-
-    </FrameLayout>
-
-    <RelativeLayout
-        android:id="@+id/primary_card"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:layout_alignParentTop="true"
-        android:paddingLeft="3dip"
-        android:paddingRight="3dip"
-        android:paddingTop="3dip"
-        android:paddingBottom="8dip"
-        android:background="@drawable/bg_calendar_primary"
-        android:orientation="vertical"
-        android:visibility="gone"
-        >
-
-        <TextView
-            android:id="@+id/when"
-            android:layout_width="fill_parent"
-            android:layout_height="wrap_content"
-            android:paddingRight="8dip"
-            android:paddingLeft="8dip"
-            android:paddingTop="1dip"
-            android:paddingBottom="1dip"
-            android:gravity="center_vertical"
-            android:background="@drawable/strip_cal"
-            android:textStyle="bold"
-            android:textSize="11sp"
-            android:textColor="@color/gadget_when"
-            android:singleLine="true"
-            />
-
-        <TextView
-            android:id="@+id/icon"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_below="@id/when"
-            android:layout_alignParentRight="true"
-            android:background="@drawable/gadget_date_bg"
-            android:textStyle="bold"
-            android:textSize="18sp"
-            android:gravity="center"
-            android:paddingLeft="8dip"
-            android:paddingRight="7dip"
-            android:paddingTop="3dip"
-            android:paddingBottom="3dip"
-            android:layout_marginRight="5dip"
-            android:layout_marginTop="4dip"
-            android:layout_marginBottom="4dip"
-            android:textColor="#59b4f4"
-            android:shadowColor="#ffff"
-            android:shadowRadius="2.75"
-            android:minWidth="32dip"
-            />
-
-        <TextView
-            android:id="@+id/title"
-            android:layout_width="fill_parent"
-            android:layout_height="wrap_content"
-            android:layout_alignParentLeft="true"
-            android:layout_below="@id/when"
-            android:layout_toLeftOf="@id/icon"
-            android:paddingRight="8dip"
-            android:paddingLeft="8dip"
-            android:textStyle="bold"
-            android:textSize="16sp"
-            android:textColor="@color/gadget_title"
-            android:singleLine="true"
-            />
-
-        <TextView
-            android:id="@+id/where"
-            android:layout_width="fill_parent"
-            android:layout_height="wrap_content"
-            android:layout_below="@id/title"
-            android:layout_toLeftOf="@id/icon"
-            android:layout_alignParentLeft="true"
-            android:paddingRight="8dip"
-            android:paddingLeft="8dip"
-            android:textSize="11sp"
-            android:textColor="@color/gadget_where"
-            android:singleLine="true"
-            />
-
-    </RelativeLayout>
-
-</RelativeLayout>
-
diff --git a/res/layout/gadget_item.xml b/res/layout/gadget_item.xml
deleted file mode 100644
index e888089..0000000
--- a/res/layout/gadget_item.xml
+++ /dev/null
@@ -1,216 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2009 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.
--->
-
-
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/gadget"
-    android:layout_width="fill_parent"
-    android:layout_height="wrap_content"
-    android:paddingBottom="6dip"
-    android:background="@drawable/bg_calendar"
-    >
-
-    <TextView
-        android:id="@+id/no_events"
-        android:layout_width="fill_parent"
-        android:layout_height="fill_parent"
-        android:paddingTop="6dip"
-        android:gravity="center"
-        android:textStyle="bold"
-        android:textSize="16sp"
-        android:text="@string/gadget_no_events"
-        android:textColor="@color/gadget_no_events"
-        />
-
-    <LinearLayout
-        android:id="@+id/secondary_card"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginLeft="3dip"
-        android:layout_marginRight="3dip"
-        android:orientation="vertical"
-        android:visibility="gone"
-        >
-
-        <TextView
-            android:id="@+id/stub_when"
-            android:layout_width="fill_parent"
-            android:layout_height="wrap_content"
-            android:textStyle="bold"
-            android:textSize="11sp"
-            android:paddingTop="8dip"
-            android:visibility="invisible"
-            />
-
-        <TextView
-            android:id="@+id/stub_title"
-            android:layout_width="fill_parent"
-            android:layout_height="wrap_content"
-            android:textStyle="bold"
-            android:textSize="16sp"
-            android:visibility="invisible"
-            />
-
-        <TextView
-            android:id="@+id/stub_where"
-            android:layout_width="fill_parent"
-            android:layout_height="wrap_content"
-            android:textSize="11sp"
-            android:visibility="invisible"
-            />
-
-        <TextView
-            android:id="@+id/secondary_when"
-            android:layout_width="fill_parent"
-            android:layout_height="wrap_content"
-            android:paddingLeft="8dip"
-            android:paddingRight="8dip"
-            android:paddingTop="1dip"
-            android:paddingBottom="1dip"
-            android:gravity="center_vertical"
-            android:background="@drawable/strip_cal_secondary"
-            android:textStyle="bold"
-            android:textSize="11sp"
-            android:textColor="@color/gadget_when"
-            android:singleLine="true"
-            />
-
-        <TextView
-            android:id="@+id/secondary_title"
-            android:layout_width="fill_parent"
-            android:layout_height="wrap_content"
-            android:paddingLeft="8dip"
-            android:paddingRight="8dip"
-            android:textSize="11sp"
-            android:textColor="@color/gadget_title"
-            android:singleLine="true"
-            />
-
-    </LinearLayout>
-
-    <RelativeLayout
-        android:id="@+id/primary_card"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:layout_alignParentTop="true"
-        android:paddingLeft="3dip"
-        android:paddingRight="3dip"
-        android:paddingTop="3dip"
-        android:paddingBottom="8dip"
-        android:background="@drawable/bg_calendar_primary"
-        android:orientation="vertical"
-        android:visibility="gone"
-        >
-
-        <TextView
-            android:id="@+id/when"
-            android:layout_width="fill_parent"
-            android:layout_height="wrap_content"
-            android:paddingRight="8dip"
-            android:paddingLeft="8dip"
-            android:paddingTop="1dip"
-            android:paddingBottom="1dip"
-            android:gravity="center_vertical"
-            android:background="@drawable/strip_cal"
-            android:textStyle="bold"
-            android:textSize="11sp"
-            android:textColor="@color/gadget_when"
-            android:singleLine="true"
-            />
-
-        <TextView
-            android:id="@+id/icon"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_below="@id/when"
-            android:layout_alignParentRight="true"
-            android:background="@drawable/gadget_date_bg"
-            android:textStyle="bold"
-            android:textSize="18sp"
-            android:gravity="center"
-            android:paddingLeft="8dip"
-            android:paddingRight="7dip"
-            android:paddingTop="3dip"
-            android:paddingBottom="3dip"
-            android:layout_marginRight="5dip"
-            android:layout_marginTop="4dip"
-            android:layout_marginBottom="4dip"
-            android:textColor="#59b4f4"
-            android:shadowColor="#ffff"
-            android:shadowRadius="2.75"
-            android:minWidth="32dip"
-            />
-
-        <TextView
-            android:id="@+id/title"
-            android:layout_width="fill_parent"
-            android:layout_height="wrap_content"
-            android:layout_alignParentLeft="true"
-            android:layout_below="@id/when"
-            android:layout_toLeftOf="@id/icon"
-            android:paddingRight="8dip"
-            android:paddingLeft="8dip"
-            android:textStyle="bold"
-            android:textSize="16sp"
-            android:textColor="@color/gadget_title"
-            android:singleLine="true"
-            />
-
-        <TextView
-            android:id="@+id/where"
-            android:layout_width="fill_parent"
-            android:layout_height="wrap_content"
-            android:layout_below="@id/title"
-            android:layout_toLeftOf="@id/icon"
-            android:layout_alignParentLeft="true"
-            android:paddingRight="8dip"
-            android:paddingLeft="8dip"
-            android:textSize="11sp"
-            android:textColor="@color/gadget_where"
-            android:singleLine="true"
-            />
-
-        <ImageView
-            android:id="@+id/divider"
-            android:layout_width="fill_parent"
-            android:layout_height="wrap_content"
-            android:layout_below="@id/icon"
-            android:layout_alignParentLeft="true"
-            android:layout_marginTop="4dip"
-            android:layout_marginBottom="2dip"
-            android:layout_marginLeft="16dip"
-            android:layout_marginRight="16dip"
-            android:background="@drawable/white_list_rule_cal"
-            />
-
-        <TextView
-            android:id="@+id/title2"
-            android:layout_width="fill_parent"
-            android:layout_height="wrap_content"
-            android:layout_below="@id/divider"
-            android:layout_alignParentLeft="true"
-            android:paddingRight="8dip"
-            android:paddingLeft="8dip"
-            android:textStyle="bold"
-            android:textSize="11sp"
-            android:textColor="@color/gadget_title"
-            android:singleLine="true"
-            />
-
-    </RelativeLayout>
-
-</RelativeLayout>
-
diff --git a/res/values/colors.xml b/res/values/colors.xml
deleted file mode 100644
index f6a9f3a..0000000
--- a/res/values/colors.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2009 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.
--->
-
-<resources>
-    <color name="gadget_when">#ffffffff</color>
-    <color name="gadget_reminder">#ffffffff</color>
-    <color name="gadget_title">#ff000000</color>
-    <color name="gadget_where">#ff000000</color>
-    <color name="gadget_calendar">#ff000000</color>
-
-    <color name="gadget_no_events">#bb000000</color>
-</resources>
-
diff --git a/res/values/strings.xml b/res/values/strings.xml
deleted file mode 100644
index be90d2e..0000000
--- a/res/values/strings.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2009 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.
--->
-
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-
-    <!-- Title for calendar gadget when displayed in list of all other gadgets -->
-    <string name="gadget_title">Calendar</string>
-
-    <!-- Title of event when no explicit title is specified by the user -->
-    <string name="no_title_label">(No subject)</string>
-
-    <!-- Shown in gadget when additional events are available for display, but no room remaining -->
-    <plurals name="gadget_more_events">
-        <!-- additional events message for 1 event -->
-        <item quantity="one">1 more event</item>
-        <!-- additional events message for multiple events -->
-        <item quantity="other"><xliff:g id="number">%d</xliff:g> more events</item>
-    </plurals>
-
-    <!-- Caption to show on gadget when there are no upcoming calendar events -->
-    <string name="gadget_no_events">No upcoming calendar events</string>
-
-</resources>
diff --git a/res/xml/gadget_info.xml b/res/xml/gadget_info.xml
deleted file mode 100644
index 317384a..0000000
--- a/res/xml/gadget_info.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2009 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.
--->
-
-<gadget-provider xmlns:android="http://schemas.android.com/apk/res/android"
-    android:minWidth="294dip"
-    android:minHeight="72dip"
-    android:updatePeriodMillis="0"
-    android:initialLayout="@layout/gadget_item"
-    >
-</gadget-provider>
diff --git a/src/com/android/providers/calendar/CalendarGadgetProvider.java b/src/com/android/providers/calendar/CalendarGadgetProvider.java
deleted file mode 100644
index 9afcade..0000000
--- a/src/com/android/providers/calendar/CalendarGadgetProvider.java
+++ /dev/null
@@ -1,645 +0,0 @@
-/*
- * Copyright (C) 2009 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.providers.calendar;
-
-import android.app.AlarmManager;
-import android.app.PendingIntent;
-import android.content.ComponentName;
-import android.content.ContentResolver;
-import android.content.ContentUris;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.content.res.Resources;
-import android.database.Cursor;
-import android.gadget.GadgetManager;
-import android.gadget.GadgetProvider;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.PorterDuff;
-import android.net.Uri;
-import android.provider.Calendar.Attendees;
-import android.provider.Calendar.Calendars;
-import android.provider.Calendar.Instances;
-import android.text.format.DateFormat;
-import android.text.format.DateUtils;
-import android.text.format.Time;
-import android.util.Log;
-import android.view.View;
-import android.widget.RemoteViews;
-
-import java.util.TimeZone;
-
-/**
- * Simple gadget to show next upcoming calendar event.
- */
-public class CalendarGadgetProvider extends GadgetProvider {
-    static final String TAG = "CalendarGadgetProvider";
-    static final boolean LOGD = true;
-    
-    static final String EVENT_SORT_ORDER = "startDay ASC, allDay DESC, begin ASC";
-
-    static final String[] EVENT_PROJECTION = new String[] {
-        Instances.ALL_DAY,
-        Instances.BEGIN,
-        Instances.END,
-        Instances.COLOR,
-        Instances.TITLE,
-        Instances.RRULE,
-        Instances.HAS_ALARM,
-        Instances.EVENT_LOCATION,
-        Instances.CALENDAR_ID,
-        Instances.EVENT_ID,
-    };
-
-    static final int INDEX_ALL_DAY = 0;
-    static final int INDEX_BEGIN = 1;
-    static final int INDEX_END = 2;
-    static final int INDEX_COLOR = 3;
-    static final int INDEX_TITLE = 4;
-    static final int INDEX_RRULE = 5;
-    static final int INDEX_HAS_ALARM = 6;
-    static final int INDEX_EVENT_LOCATION = 7;
-    static final int INDEX_CALENDAR_ID = 8;
-    static final int INDEX_EVENT_ID = 9;
-    
-    static final long SEARCH_DURATION = DateUtils.WEEK_IN_MILLIS;
-    
-    static final long UPDATE_NO_EVENTS = DateUtils.HOUR_IN_MILLIS * 6;
-
-    static final String ACTION_CALENDAR_GADGET_UPDATE = "com.android.calendar.GADGET_UPDATE";
-    
-    static final String PACKAGE_DETAIL = "com.android.calendar";
-    static final String CLASS_DETAIL = "com.android.calendar.AgendaActivity";
-    
-    static final ComponentName THIS_GADGET =
-        new ComponentName("com.android.providers.calendar",
-                "com.android.providers.calendar.CalendarGadgetProvider");
-    
-    private static CalendarGadgetProvider sInstance;
-    
-    static synchronized CalendarGadgetProvider getInstance() {
-        if (sInstance == null) {
-            sInstance = new CalendarGadgetProvider();
-        }
-        return sInstance;
-    }
-    
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void onReceive(Context context, Intent intent) {
-        // Handle calendar-specific updates ourselves because they might be
-        // coming in without extras, which GadgetProvider then blocks.
-        final String action = intent.getAction();
-        if (ACTION_CALENDAR_GADGET_UPDATE.equals(action)) {
-            performUpdate(context, null, -1);
-        } else {
-            super.onReceive(context, intent);
-        }
-    }
-    
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void onEnabled(Context context) {
-        // Enable updates for timezone and date changes
-        PackageManager pm = context.getPackageManager();
-        pm.setComponentEnabledSetting(
-                new ComponentName(context, TimeChangeReceiver.class),
-                PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
-                PackageManager.DONT_KILL_APP);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void onDisabled(Context context) {
-        // Unsubscribe from all AlarmManager updates
-        AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
-        PendingIntent pendingUpdate = getUpdateIntent(context);
-        am.cancel(pendingUpdate);
-
-        // Disable updates for timezone and date changes
-        PackageManager pm = context.getPackageManager();
-        pm.setComponentEnabledSetting(
-                new ComponentName(context, TimeChangeReceiver.class),
-                PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
-                PackageManager.DONT_KILL_APP);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void onUpdate(Context context, GadgetManager gadgetManager, int[] gadgetIds) {
-        performUpdate(context, gadgetIds, -1);
-    }
-    
-    /**
-     * Check against {@link GadgetManager} if there are any instances of this gadget.
-     */
-    private boolean hasInstances(Context context) {
-        GadgetManager gadgetManager = GadgetManager.getInstance(context);
-        int[] gadgetIds = gadgetManager.getGadgetIds(THIS_GADGET);
-        return (gadgetIds.length > 0);
-    }
-
-    /**
-     * The {@link CalendarProvider} has been updated, which means we should push
-     * updates to any gadgets, if they exist.
-     * 
-     * @param changedEventId Specific event known to be changed, otherwise -1.
-     *            If present, we use it to decide if an update is necessary.
-     */
-    void providerUpdated(Context context, long changedEventId) {
-        if (hasInstances(context)) {
-            performUpdate(context, null, changedEventId);
-        }
-    }
-    
-    /**
-     * {@link TimeChangeReceiver} has triggered that the time changed.
-     */
-    void timeUpdated(Context context) {
-        if (hasInstances(context)) {
-            performUpdate(context, null, -1);
-        }
-    }
-
-    /**
-     * Process and push out an update for the given gadgetIds.
-     * 
-     * @param context Context to use when creating gadget.
-     * @param gadgetIds List of specific gadgetIds to update, or null for all.
-     * @param changedEventId Specific event known to be changed, otherwise -1.
-     *            If present, we use it to decide if an update is necessary.
-     */
-    private void performUpdate(Context context, int[] gadgetIds, long changedEventId) {
-        ContentResolver resolver = context.getContentResolver();
-        
-        Cursor cursor = null;
-        RemoteViews views = null;
-        long triggerTime = -1;
-
-        try {
-            cursor = getUpcomingInstancesCursor(resolver, SEARCH_DURATION);
-            if (cursor != null) {
-                MarkedEvents events = buildMarkedEvents(cursor, changedEventId);
-                
-                boolean shouldUpdate = true;
-                if (changedEventId != -1) {
-                    shouldUpdate = events.watchFound;
-                }
-                
-                if (events.primaryCount == 0) {
-                    views = getGadgetNoEvents(context);
-                } else if (shouldUpdate) {
-                    views = getGadgetUpdate(context, cursor, events);
-                    triggerTime = calculateUpdateTime(context, cursor, events);
-                }
-            } else {
-                views = getGadgetNoEvents(context);
-            }
-        } finally {
-            if (cursor != null) {
-                cursor.close();
-            }
-        }
-        
-        // Bail out early if no update built
-        if (views == null) {
-            if (LOGD) Log.d(TAG, "Didn't build update, possibly because changedEventId=" + changedEventId);
-            return;
-        }
-        
-        GadgetManager gm = GadgetManager.getInstance(context);
-        if (gadgetIds != null) {
-            gm.updateGadget(gadgetIds, views);
-        } else {
-            ComponentName thisGadget = new ComponentName(context, CalendarGadgetProvider.class);
-            gm.updateGadget(thisGadget, views);
-        }
-
-        // Schedule an alarm to wake ourselves up for the next update.  We also cancel
-        // all existing wake-ups because PendingIntents don't match against extras.
-        
-        // If no next-update calculated, or bad trigger time in past, schedule
-        // update about six hours from now.
-        long now = System.currentTimeMillis();
-        if (triggerTime == -1 || triggerTime < now) {
-            if (LOGD) Log.w(TAG, "Encountered bad trigger time " + formatDebugTime(triggerTime));
-            triggerTime = now + UPDATE_NO_EVENTS;
-        }
-        
-        AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
-        PendingIntent pendingUpdate = getUpdateIntent(context);
-        
-        am.cancel(pendingUpdate);
-        am.set(AlarmManager.RTC, triggerTime, pendingUpdate);
-
-        if (LOGD) Log.d(TAG, "Scheduled next update at " + formatDebugTime(triggerTime));
-    }
-    
-    /**
-     * Build the {@link PendingIntent} used to trigger an update of all calendar
-     * gadgets. Uses {@link ACTION_CALENDAR_GADGET_UPDATE} to directly target
-     * all gadgets instead of using {@link GadgetManager#EXTRA_GADGET_IDS}.
-     */
-    private PendingIntent getUpdateIntent(Context context) {
-        Intent updateIntent = new Intent(ACTION_CALENDAR_GADGET_UPDATE);
-        updateIntent.setComponent(new ComponentName(context, CalendarGadgetProvider.class));
-        return PendingIntent.getBroadcast(context, 0 /* no requestCode */,
-                updateIntent, 0 /* no flags */);
-    }
-    
-    /**
-     * Format given time for debugging output.
-     */
-    private String formatDebugTime(long unixTime) {
-        Time time = new Time();
-        time.set(unixTime);
-        
-        long delta = unixTime - System.currentTimeMillis();
-        if (delta > DateUtils.MINUTE_IN_MILLIS) {
-            delta /= DateUtils.MINUTE_IN_MILLIS;
-            return String.format("[%d] %s (%+d mins)", unixTime, time.format("%H:%M:%S"), delta);
-        } else {
-            delta /= DateUtils.SECOND_IN_MILLIS;
-            return String.format("[%d] %s (%+d secs)", unixTime, time.format("%H:%M:%S"), delta);
-        }
-    }
-    
-    /**
-     * Convert given UTC time into current local time.
-     * 
-     * @param recycle Time object to recycle, otherwise null.
-     * @param utcTime Time to convert, in UTC.
-     */
-    private long convertUtcToLocal(Time recycle, long utcTime) {
-        if (recycle == null) {
-            recycle = new Time();
-        }
-        recycle.timezone = Time.TIMEZONE_UTC;
-        recycle.set(utcTime);
-        recycle.timezone = TimeZone.getDefault().getID();
-        return recycle.normalize(true);
-    }
-    
-    /**
-     * Figure out the next time we should push gadget updates. This is based on
-     * the time calculated by {@link #getEventFlip(Cursor, int)}.
-     */
-    private long calculateUpdateTime(Context context, Cursor cursor, MarkedEvents events) {
-        long result = -1;
-        if (events.primaryRow != -1) {
-            cursor.moveToPosition(events.primaryRow);
-            long start = cursor.getLong(INDEX_BEGIN);
-            long end = cursor.getLong(INDEX_END);
-            boolean allDay = cursor.getInt(INDEX_ALL_DAY) != 0;
-            
-            // Adjust all-day times into local timezone
-            if (allDay) {
-                final Time recycle = new Time();
-                start = convertUtcToLocal(recycle, start);
-                end = convertUtcToLocal(recycle, end);
-            }
-
-            result = getEventFlip(cursor, start, end, allDay);
-        }
-        return result;
-    }
-    
-    /**
-     * Calculate flipping point for the given event; when we should hide this
-     * event and show the next one. This is usually half-way through the event.
-     * 
-     * @param start Event start time in local timezone.
-     * @param end Event end time in local timezone.
-     */
-    private long getEventFlip(Cursor cursor, long start, long end, boolean allDay) {
-        if (allDay) {
-            return start;
-        } else {
-            return (start + end) / 2;
-        }
-    }
-    
-    /**
-     * Build a set of {@link RemoteViews} that describes how to update any
-     * gadget for a specific event instance.
-     * 
-     * @param cursor Valid cursor on {@link Instances#CONTENT_URI}
-     * @param events {@link MarkedEvents} parsed from the cursor
-     */
-    private RemoteViews getGadgetUpdate(Context context, Cursor cursor, MarkedEvents events) {
-        Resources res = context.getResources();
-        ContentResolver resolver = context.getContentResolver();
-        
-        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.gadget_item);
-        
-        // Clicking on gadget launches the agenda view in Calendar
-        Intent agendaIntent = new Intent();
-        agendaIntent.setComponent(new ComponentName(PACKAGE_DETAIL, CLASS_DETAIL));
-        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0 /* no requestCode */,
-                agendaIntent, 0 /* no flags */);
-        
-        views.setOnClickPendingIntent(R.id.gadget, pendingIntent);
-        
-        Time time = new Time();
-        time.setToNow();
-        int yearDay = time.yearDay;
-        int dateNumber = time.monthDay;
-
-        // Set calendar icon with actual date
-        views.setTextViewText(R.id.icon, Integer.toString(dateNumber));
-        views.setViewVisibility(R.id.icon, View.VISIBLE);
-        views.setViewVisibility(R.id.no_events, View.GONE);
-
-        // Fill primary event details
-        if (events.primaryRow != -1) {
-            views.setViewVisibility(R.id.primary_card, View.VISIBLE);
-            cursor.moveToPosition(events.primaryRow);
-            
-            // Color stripe
-            int colorFilter = cursor.getInt(INDEX_COLOR);
-            views.setDrawableParameters(R.id.when, true, -1, colorFilter,
-                    PorterDuff.Mode.SRC_IN, -1);
-            views.setTextColor(R.id.title, colorFilter);
-            views.setTextColor(R.id.where, colorFilter);
-            views.setDrawableParameters(R.id.divider, true, -1, colorFilter,
-                    PorterDuff.Mode.SRC_IN, -1);
-            views.setTextColor(R.id.title2, colorFilter);
-
-            // When
-            long start = cursor.getLong(INDEX_BEGIN);
-            boolean allDay = cursor.getInt(INDEX_ALL_DAY) != 0;
-            
-            int flags;
-            String whenString;
-            if (allDay) {
-                flags = DateUtils.FORMAT_ABBREV_ALL | DateUtils.FORMAT_UTC
-                        | DateUtils.FORMAT_SHOW_DATE;
-            } else {
-                flags = DateUtils.FORMAT_ABBREV_ALL | DateUtils.FORMAT_SHOW_TIME;
-                
-                // Show date if different from today
-                time.set(start);
-                if (yearDay != time.yearDay) {
-                    flags = flags | DateUtils.FORMAT_SHOW_DATE;
-                }
-            }
-            if (DateFormat.is24HourFormat(context)) {
-                flags |= DateUtils.FORMAT_24HOUR;
-            }
-            whenString = DateUtils.formatDateRange(context, start, start, flags);
-            views.setTextViewText(R.id.when, whenString);
-
-            // What
-            String titleString = cursor.getString(INDEX_TITLE);
-            if (titleString == null || titleString.length() == 0) {
-                titleString = context.getString(R.string.no_title_label);
-            }
-            views.setTextViewText(R.id.title, titleString);
-            
-            // Where
-            String whereString = cursor.getString(INDEX_EVENT_LOCATION);
-            if (whereString != null && whereString.length() > 0) {
-                views.setViewVisibility(R.id.where, View.VISIBLE);
-                views.setViewVisibility(R.id.stub_where, View.INVISIBLE);
-                views.setTextViewText(R.id.where, whereString);
-            } else {
-                views.setViewVisibility(R.id.where, View.GONE);
-                views.setViewVisibility(R.id.stub_where, View.GONE);
-            }
-        }
-        
-        // Fill other primary events, if present
-        if (events.primaryConflictRow != -1) {
-            views.setViewVisibility(R.id.divider, View.VISIBLE);
-            views.setViewVisibility(R.id.title2, View.VISIBLE);
-
-            if (events.primaryCount > 2) {
-                // If more than two primary conflicts, format multiple message
-                int count = events.primaryCount - 1;
-                String titleString = String.format(res.getQuantityString(
-                        R.plurals.gadget_more_events, count), count);
-                views.setTextViewText(R.id.title2, titleString);
-            } else {
-                cursor.moveToPosition(events.primaryConflictRow);
-
-                // What
-                String titleString = cursor.getString(INDEX_TITLE);
-                if (titleString == null || titleString.length() == 0) {
-                    titleString = context.getString(R.string.no_title_label);
-                }
-                views.setTextViewText(R.id.title2, titleString);
-            }
-        } else {
-            views.setViewVisibility(R.id.divider, View.GONE);
-            views.setViewVisibility(R.id.title2, View.GONE);
-        }
-        
-        // Fill secondary event
-        if (events.secondaryRow != -1) {
-            views.setViewVisibility(R.id.secondary_card, View.VISIBLE);
-            views.setViewVisibility(R.id.secondary_when, View.VISIBLE);
-            views.setViewVisibility(R.id.secondary_title, View.VISIBLE);
-            
-            cursor.moveToPosition(events.secondaryRow);
-            
-            // Color stripe
-            int colorFilter = cursor.getInt(INDEX_COLOR);
-            views.setDrawableParameters(R.id.secondary_when, true, -1, colorFilter,
-                    PorterDuff.Mode.SRC_IN, -1);
-            views.setTextColor(R.id.secondary_title, colorFilter);
-            
-            // When
-            long start = cursor.getLong(INDEX_BEGIN);
-            boolean allDay = cursor.getInt(INDEX_ALL_DAY) != 0;
-            
-            int flags;
-            String whenString;
-            if (allDay) {
-                flags = DateUtils.FORMAT_ABBREV_ALL | DateUtils.FORMAT_UTC
-                        | DateUtils.FORMAT_SHOW_DATE;
-            } else {
-                flags = DateUtils.FORMAT_ABBREV_ALL | DateUtils.FORMAT_SHOW_TIME;
-                
-                // Show date if different from today
-                time.set(start);
-                if (yearDay != time.yearDay) {
-                    flags = flags | DateUtils.FORMAT_SHOW_DATE;
-                }
-            }
-            if (DateFormat.is24HourFormat(context)) {
-                flags |= DateUtils.FORMAT_24HOUR;
-            }
-            whenString = DateUtils.formatDateRange(context, start, start, flags);
-            views.setTextViewText(R.id.secondary_when, whenString);
-            
-            if (events.secondaryCount > 1) {
-                // If more than two secondary conflicts, format multiple message
-                int count = events.secondaryCount;
-                String titleString = String.format(res.getQuantityString(
-                        R.plurals.gadget_more_events, count), count);
-                views.setTextViewText(R.id.secondary_title, titleString);
-            } else {
-                // What
-                String titleString = cursor.getString(INDEX_TITLE);
-                if (titleString == null || titleString.length() == 0) {
-                    titleString = context.getString(R.string.no_title_label);
-                }
-                views.setTextViewText(R.id.secondary_title, titleString);
-            }
-        } else {
-            views.setViewVisibility(R.id.secondary_when, View.GONE);
-            views.setViewVisibility(R.id.secondary_title, View.GONE);
-        }
-        
-        return views;
-    }
-    
-    /**
-     * Build a set of {@link RemoteViews} that describes an error state.
-     */
-    private RemoteViews getGadgetNoEvents(Context context) {
-        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.gadget_item);
-
-        views.setViewVisibility(R.id.no_events, View.VISIBLE);
-        
-        views.setViewVisibility(R.id.primary_card, View.GONE);
-        views.setViewVisibility(R.id.secondary_card, View.GONE);
-        
-        // Clicking on gadget launches the agenda view in Calendar
-        Intent agendaIntent = new Intent();
-        agendaIntent.setComponent(new ComponentName(PACKAGE_DETAIL, CLASS_DETAIL));
-        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0 /* no requestCode */,
-                agendaIntent, 0 /* no flags */);
-        
-        views.setOnClickPendingIntent(R.id.gadget, pendingIntent);
-
-        return views;
-    }
-    
-    private static class MarkedEvents {
-        long primaryTime = -1;
-        int primaryRow = -1;
-        int primaryConflictRow = -1;
-        int primaryCount = 0;
-        long secondaryTime = -1;
-        int secondaryRow = -1;
-        int secondaryCount = 0;
-        boolean watchFound = false;
-    }
-
-    /**
-     * Walk the given instances cursor and build a list of marked events to be
-     * used when updating the gadget. This structure is also used to check if
-     * updates are needed.
-     * 
-     * @param cursor Valid cursor across {@link Instances#CONTENT_URI}.
-     * @param watchEventId Specific event to watch for, setting
-     *            {@link MarkedEvents#watchFound} if found during marking.
-     */
-    private MarkedEvents buildMarkedEvents(Cursor cursor, long watchEventId) {
-        MarkedEvents events = new MarkedEvents();
-        long now = System.currentTimeMillis();
-        final Time recycle = new Time();
-        
-        cursor.moveToPosition(-1);
-        while (cursor.moveToNext()) {
-            int row = cursor.getPosition();
-            long eventId = cursor.getLong(INDEX_EVENT_ID);
-            long start = cursor.getLong(INDEX_BEGIN);
-            long end = cursor.getLong(INDEX_END);
-            boolean allDay = cursor.getInt(INDEX_ALL_DAY) != 0;
-
-            // Adjust all-day times into local timezone
-            if (allDay) {
-                start = convertUtcToLocal(recycle, start);
-                end = convertUtcToLocal(recycle, end);
-            }
-            
-            // Skip events that have already passed their flip times
-            long eventFlip = getEventFlip(cursor, start, end, allDay);
-            if (LOGD) Log.d(TAG, "Calculated flip time " + formatDebugTime(eventFlip));
-            if (eventFlip < now) {
-                continue;
-            }
-            
-            // Mark if we've encountered the watched event
-            if (eventId == watchEventId) {
-                events.watchFound = true;
-            }
-            
-            if (events.primaryRow == -1) {
-                // Found first event
-                events.primaryRow = row;
-                events.primaryTime = start;
-                events.primaryCount = 1;
-            } else if (events.primaryTime == start) {
-                // Found conflicting primary event
-                if (events.primaryConflictRow == -1) {
-                    events.primaryConflictRow = row;
-                }
-                events.primaryCount += 1;
-            } else if (events.secondaryRow == -1) {
-                // Found second event
-                events.secondaryRow = row;
-                events.secondaryTime = start;
-                events.secondaryCount = 1;
-            } else if (events.secondaryTime == start) {
-                // Found conflicting secondary event
-                events.secondaryCount += 1;
-            } else {
-                // Nothing interesting about this event, so bail out
-                break;
-            }
-        }
-        return events;
-    }
-    
-    /**
-     * Query across all calendars for upcoming event instances from now until
-     * some time in the future.
-     * 
-     * @param searchDuration Distance into the future to look for event
-     *            instances, in milliseconds.
-     */
-    private Cursor getUpcomingInstancesCursor(ContentResolver resolver, long searchDuration) {
-        // Search for events from now until some time in the future
-        long start = System.currentTimeMillis();
-        long end = start + searchDuration;
-        
-        Uri uri = Uri.withAppendedPath(Instances.CONTENT_URI,
-                String.format("%d/%d", start, end));
-
-        String selection = String.format("%s=1 AND %s!=%d",
-                Calendars.SELECTED, Instances.SELF_ATTENDEE_STATUS,
-                Attendees.ATTENDEE_STATUS_DECLINED);
-        
-        return resolver.query(uri, EVENT_PROJECTION, selection, null,
-                EVENT_SORT_ORDER);
-    }
-    
-}
diff --git a/src/com/android/providers/calendar/CalendarProvider.java b/src/com/android/providers/calendar/CalendarProvider.java
index a053a15..5fe0998 100644
--- a/src/com/android/providers/calendar/CalendarProvider.java
+++ b/src/com/android/providers/calendar/CalendarProvider.java
@@ -180,17 +180,15 @@
 
     // A thread that runs in the background and schedules the next
     // calendar event alarm.
-    private class AlarmScheduler extends Thread {
-        boolean mRemoveAlarms;
-        
-        public AlarmScheduler(boolean removeAlarms) {
-            mRemoveAlarms = removeAlarms;
+    private class AlarmScheduler implements Runnable {
+
+        public AlarmScheduler() {
         }
 
         public void run() {
             try {
                 Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
-                runScheduleNextAlarm(mRemoveAlarms);
+                runScheduleNextAlarm();
             } catch (SQLException e) {
                 Log.e(TAG, "runScheduleNextAlarm() failed", e);
             }
@@ -272,7 +270,6 @@
     private AlarmManager mAlarmManager;
 
     private CalendarSyncAdapter mSyncAdapter;
-    private CalendarGadgetProvider mGadgetProvider = CalendarGadgetProvider.getInstance();
 
     /**
      * Listens for timezone changes and disk-no-longer-full events
@@ -286,13 +283,13 @@
             }
             if (Intent.ACTION_TIMEZONE_CHANGED.equals(action)) {
                 updateTimezoneDependentFields();
-                scheduleNextAlarm(false /* do not remove alarms */);
+                scheduleNextAlarm();
             } else if (Intent.ACTION_DEVICE_STORAGE_OK.equals(action)) {
                 // Try to clean up if things were screwy due to a full disk
                 updateTimezoneDependentFields();
-                scheduleNextAlarm(false /* do not remove alarms */);
+                scheduleNextAlarm();
             } else if (Intent.ACTION_TIME_CHANGED.equals(action)) {
-                scheduleNextAlarm(false /* do not remove alarms */);
+                scheduleNextAlarm();
             }
         }
     };
@@ -2411,7 +2408,6 @@
                         int status = initialValues.getAsInteger(Events.SELF_ATTENDEE_STATUS);
                         createAttendeeEntry(rowId, status);
                     }
-                    triggerGadgetUpdate(rowId);
                 }
 
                 return uri;
@@ -2459,7 +2455,7 @@
                     if (DEBUG_ALARMS) {
                         Log.i(TAG, "insertInternal() changing reminder");
                     }
-                    scheduleNextAlarm(false /* do not remove alarms */);
+                    scheduleNextAlarm();
                 }
                 return Uri.parse("content://calendars/reminders/" + rowID);
             case CALENDAR_ALERTS:
@@ -2938,7 +2934,6 @@
                         cursor.close();
                         cursor = null;
                     }
-                    triggerGadgetUpdate(-1);
                 }
 
                 // There is a delete trigger that will cause all instances
@@ -3107,8 +3102,7 @@
                             if (DEBUG_ALARMS) {
                                 Log.i(TAG, "updateInternal() changing event");
                             }
-                            scheduleNextAlarm(false /* do not remove alarms */);
-                            triggerGadgetUpdate(id);
+                            scheduleNextAlarm();
                         }
                     }
                 }
@@ -3137,7 +3131,7 @@
                     if (DEBUG_ALARMS) {
                         Log.i(TAG, "updateInternal() changing reminder");
                     }
-                    scheduleNextAlarm(false /* do not remove alarms */);
+                    scheduleNextAlarm();
                 }
                 return result;
             }
@@ -3258,37 +3252,13 @@
         if (DEBUG_ALARMS) {
             Log.i(TAG, "onSyncStop() success: " + success);
         }
-        scheduleNextAlarm(false /* do not remove alarms */);
-        triggerGadgetUpdate(-1);
+        scheduleNextAlarm();
     }
 
     @Override
     protected Iterable<EventMerger> getMergers() {
         return Collections.singletonList(new EventMerger());
     }
-    
-    /**
-     * Update any existing gadgets with the changed events.
-     * 
-     * @param changedEventId Specific event known to be changed, otherwise -1.
-     *            If present, we use it to decide if an update is necessary.
-     */
-    private synchronized void triggerGadgetUpdate(long changedEventId) {
-        Context context = getContext();
-        if (context != null) {
-            mGadgetProvider.providerUpdated(context, changedEventId);
-        }
-    }
-    
-    void bootCompleted() {
-        // Remove alarms from the CalendarAlerts table that have been marked
-        // as "scheduled" but not fired yet.  We do this because the
-        // AlarmManagerService loses all information about alarms when the
-        // power turns off but we store the information in a database table
-        // that persists across reboots. See the documentation for
-        // scheduleNextAlarmLocked() for more information.
-        scheduleNextAlarm(true /* remove alarms */);
-    }
 
     /* Retrieve and cache the alarm manager */
     private AlarmManager getAlarmManager() {
@@ -3340,8 +3310,8 @@
     /*
      * This method runs the alarm scheduler in a background thread.
      */
-    void scheduleNextAlarm(boolean removeAlarms) {
-        Thread thread = new AlarmScheduler(removeAlarms);
+    void scheduleNextAlarm() {
+        Thread thread = new Thread(new AlarmScheduler());
         thread.start();
     }
 
@@ -3349,8 +3319,9 @@
      * This method runs in a background thread and schedules an alarm for
      * the next calendar event, if necessary.
      */
-    private void runScheduleNextAlarm(boolean removeAlarms) {
-        // Do not schedule any alarms if this is a temporary database.
+    private void runScheduleNextAlarm() {
+        // Do not schedule any events while syncing or if this is a temporary
+        // database.
         if (isTemporary()) {
             if (DEBUG_ALARMS) {
                 Log.i(TAG, "runScheduleNextAlarm cancelled because database is temporary");
@@ -3361,9 +3332,6 @@
         final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
         db.beginTransaction();
         try {
-            if (removeAlarms) {
-                removeScheduledAlarmsLocked(db);
-            }
             scheduleNextAlarmLocked(db);
             db.setTransactionSuccessful();
         } finally {
@@ -3373,27 +3341,7 @@
 
     /**
      * This method looks at the 24-hour window from now for any events that it
-     * needs to schedule.  This method runs within a database transaction. It
-     * also runs in a background thread.
-     * 
-     * The CalendarProvider keeps track of which alarms it has already scheduled
-     * to avoid scheduling them more than once and for debugging problems with
-     * alarms.  It stores this knowledge in a database table called CalendarAlerts
-     * which persists across reboots.  But the actual alarm list is in memory
-     * and disappears if the phone loses power.  To avoid missing an alarm, we
-     * clear the entries in the CalendarAlerts table when we start up the
-     * CalendarProvider.
-     * 
-     * Scheduling an alarm multiple times is not tragic -- we filter out the
-     * extra ones when we receive them. But we still need to keep track of the
-     * scheduled alarms. The main reason is that we need to prevent multiple
-     * notifications for the same alarm (on the receive side) in case we
-     * accidentally schedule the same alarm multiple times.  We don't have
-     * visibility into the system's alarm list so we can never know for sure if
-     * we have already scheduled an alarm and it's better to err on scheduling
-     * an alarm twice rather than missing an alarm.  Another reason we keep
-     * track of scheduled alarms in a database table is that it makes it easy to
-     * run an SQL query to find the next reminder that we haven't scheduled.
+     * needs to schedule.  This method runs within a database transaction.
      *
      * @param db the database
      */
@@ -3460,7 +3408,7 @@
             + " AND CA.alarmTime=myAlarmTime)"
             + " ORDER BY myAlarmTime,begin,title";
 
-        acquireInstanceRangeLocked(start, end, false /* don't use minimum expansion windows */);
+        acquireInstanceRange(start, end, false /* don't use minimum expansion windows */);
         Cursor cursor = null;
         try {
             cursor = db.rawQuery(query, null);
@@ -3476,8 +3424,7 @@
                 time.set(nextAlarmTime);
                 String alarmTimeStr = time.format(" %a, %b %d, %Y %I:%M%P");
                 Log.i(TAG, "nextAlarmTime: " + alarmTimeStr
-                        + " cursor results: " + cursor.getCount()
-                        + " query: " + query);
+                        + " cursor results: " + cursor.getCount());
             }
 
             while (cursor.moveToNext()) {
@@ -3586,30 +3533,6 @@
             scheduleNextAlarmCheck(currentMillis + android.text.format.DateUtils.DAY_IN_MILLIS);
         }
     }
-    
-    /**
-     * Removes the entries in the CalendarAlerts table for alarms that we have
-     * scheduled but that have not fired yet. We do this to ensure that we
-     * don't miss an alarm.  The CalendarAlerts table keeps track of the
-     * alarms that we have scheduled but the actual alarm list is in memory
-     * and will be cleared if the phone reboots.
-     * 
-     * We don't need to remove entries that have already fired, and in fact
-     * we should not remove them because we need to display the notifications
-     * until the user dismisses them.
-     * 
-     * We could remove entries that have fired and been dismissed, but we leave
-     * them around for a while because it makes it easier to debug problems.
-     * Entries that are old enough will be cleaned up later when we schedule
-     * new alarms.
-     */
-    private void removeScheduledAlarmsLocked(SQLiteDatabase db) {
-        if (DEBUG_ALARMS) {
-            Log.i(TAG, "removing scheduled alarms");
-        }
-        db.delete(CalendarAlerts.TABLE_NAME,
-                CalendarAlerts.STATE + "=" + CalendarAlerts.SCHEDULED, null /* whereArgs */);
-    }
 
     private static String sEventsTable = "Events";
     private static Uri sEventsURL =
diff --git a/src/com/android/providers/calendar/CalendarReceiver.java b/src/com/android/providers/calendar/CalendarReceiver.java
index 21a1398..f3bef8f 100644
--- a/src/com/android/providers/calendar/CalendarReceiver.java
+++ b/src/com/android/providers/calendar/CalendarReceiver.java
@@ -16,12 +16,12 @@
 
 package com.android.providers.calendar;
 
-import android.content.BroadcastReceiver;
 import android.content.ContentProvider;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.IContentProvider;
 import android.content.Intent;
+import android.content.BroadcastReceiver;
 
 /**
  * This IntentReceiver executes when the boot completes and ensures that
@@ -43,9 +43,9 @@
         provider = (CalendarProvider) ContentProvider.
                 coerceToLocalContentProvider(icp);
         if (action.equals(SCHEDULE)) {
-            provider.scheduleNextAlarm(false /* do not remove alarms */);
+            provider.scheduleNextAlarm();
         } else if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {
-            provider.bootCompleted();
+            provider.scheduleNextAlarm();
         }
         cr.releaseProvider(icp);
     }
diff --git a/src/com/android/providers/calendar/CalendarSyncAdapter.java b/src/com/android/providers/calendar/CalendarSyncAdapter.java
index db278fe..57cb084 100644
--- a/src/com/android/providers/calendar/CalendarSyncAdapter.java
+++ b/src/com/android/providers/calendar/CalendarSyncAdapter.java
@@ -116,7 +116,7 @@
     protected CalendarSyncAdapter(Context context, SyncableContentProvider provider) {
         super(context, provider);
         mCalendarClient = new CalendarClient(
-                new AndroidGDataClient(context),
+                new AndroidGDataClient(context.getContentResolver()),
                 new XmlCalendarGDataParserFactory(new AndroidXmlParserFactory()));
     }
 
diff --git a/src/com/android/providers/calendar/RecurrenceProcessor.java b/src/com/android/providers/calendar/RecurrenceProcessor.java
index 6d68ca2..5edfd6a 100644
--- a/src/com/android/providers/calendar/RecurrenceProcessor.java
+++ b/src/com/android/providers/calendar/RecurrenceProcessor.java
@@ -33,8 +33,6 @@
     private StringBuilder mStringBuilder = new StringBuilder();
     private Time mGenerated = new Time(Time.TIMEZONE_UTC);
     private DaySet mDays = new DaySet(false);
-    // Give up after this many loops.  This is roughly 1 second of expansion.
-    private static final int MAX_ALLOWED_ITERATIONS = 2000;
 
     public RecurrenceProcessor()
     {
@@ -741,13 +739,9 @@
             boolean eventEnded = false;
             int N, i, v;
             int a[];
-            int failsafe = 0; // Avoid infinite loops
             events: {
                 while (true) {
                     int monthIndex = 0;
-                    if (failsafe++ > MAX_ALLOWED_ITERATIONS) { // Give up after about 1 second of processing
-                        throw new DateException("Recurrence processing stuck: " + r.toString());
-                    }
 
                     unsafeNormalize(iterator);
 
diff --git a/src/com/android/providers/calendar/TimeChangeReceiver.java b/src/com/android/providers/calendar/TimeChangeReceiver.java
deleted file mode 100644
index 6a7d3c6..0000000
--- a/src/com/android/providers/calendar/TimeChangeReceiver.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2009 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.providers.calendar;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.util.Log;
-
-public class TimeChangeReceiver extends BroadcastReceiver {
-    static final String TAG = "TimeChangeReceiver";
-    static final boolean LOGD = false;
-    
-    CalendarGadgetProvider mCalendarProvider = CalendarGadgetProvider.getInstance();
-    
-    @Override
-    public void onReceive(Context context, Intent intent) {
-        // Pass time-changed notification through to any gadgets
-        if (LOGD) Log.d(TAG, "Received time changed action=" + intent.getAction());
-        mCalendarProvider.timeUpdated(context);
-    }
-}
diff --git a/tests/src/com/android/providers/calendar/ICalendarTest.java b/tests/src/com/android/providers/calendar/ICalendarTest.java
index cedc92e..685d1c9 100644
--- a/tests/src/com/android/providers/calendar/ICalendarTest.java
+++ b/tests/src/com/android/providers/calendar/ICalendarTest.java
@@ -224,49 +224,4 @@
         ICalendar.Component component = ICalendar.parseComponent(text);
         assertNotNull(component);
     }
-
-    @SmallTest
-    public void testNormalize() throws Exception {
-        String text = "BEGIN:VEVENT\n" +
-                "RRULE:FREQ=SECONDLY;BYSECOND=0,1,2,\r\n 3,4,5\r\n ,6,7,8\r\n" +
-                "END:VEVENT\n";
-
-        ICalendar.Component event = ICalendar.parseEvent(text);
-
-        assertEquals("VEVENT", event.getName());
-        assertNull(event.getComponents());
-        assertEquals(1, event.getPropertyNames().size());
-        assertEquals(1, event.getProperties("RRULE").size());
-        assertEquals("FREQ=SECONDLY;BYSECOND=0,1,2,3,4,5,6,7,8", event.getFirstProperty("RRULE").getValue());
-
-    }
-
-    @SmallTest
-    public void testNormalizeBadSep() throws Exception {
-        String text = "BEGIN:VEVENT\n" +
-                "RRULE:FREQ=SECONDLY;BYSECOND=0,1,2,\n 3,4,5\n ,6,7,8\n" +
-                "END:VEVENT\n";
-
-        ICalendar.Component event = ICalendar.parseEvent(text);
-
-        assertEquals("VEVENT", event.getName());
-        assertNull(event.getComponents());
-        assertEquals(1, event.getPropertyNames().size());
-        assertEquals(1, event.getProperties("RRULE").size());
-        assertEquals("FREQ=SECONDLY;BYSECOND=0,1,2,3,4,5,6,7,8", event.getFirstProperty("RRULE").getValue());
-    }
-
-
-    @SmallTest
-    public void testBad() throws Exception {
-        String text = "BEGIN:VEVENT\n" +
-                "RRULE=foo\n" +
-                "END:VEVENT\n";
-
-        ICalendar.Component event = ICalendar.parseEvent(text);
-
-        // Note that parseEvent doesn't throw the FormatException you might expect because
-        // ICalendar.parseComponentImpl catches the exception due to misformatted GData.
-        // TODO: update this test after cleaning up the ICalendar behavior
-    }
 }
diff --git a/tests/src/com/android/providers/calendar/RRuleTest.java b/tests/src/com/android/providers/calendar/RRuleTest.java
deleted file mode 100644
index f12ec67..0000000
--- a/tests/src/com/android/providers/calendar/RRuleTest.java
+++ /dev/null
@@ -1,688 +0,0 @@
-/*
-**
-** Copyright 2009, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License"); 
-** you may not use this file except in compliance with the License. 
-** You may obtain a copy of the License at 
-**
-**     http://www.apache.org/licenses/LICENSE-2.0 
-**
-** Unless required by applicable law or agreed to in writing, software 
-** distributed under the License is distributed on an "AS IS" BASIS, 
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
-** See the License for the specific language governing permissions and 
-** limitations under the License.
-*/
-
-/* Based on http://code.google.com/p/google-rfc-2445/source/browse/trunk/test/com/google/ical/iter/RRuleIteratorImplTest.java */
-
-package com.android.providers.calendar;
-
-import android.os.Debug;
-import android.pim.DateException;
-import android.pim.RecurrenceSet;
-import android.test.suitebuilder.annotation.SmallTest;
-import android.text.format.Time;
-import junit.framework.TestCase;
-
-public class RRuleTest extends TestCase {
-    private static final String TAG = "RRuleTest";
-    private static final boolean METHOD_TRACE = false;
-
-    private static String[] getFormattedDates(long[] dates, Time time, boolean truncate) {
-        String[] out = new String[dates.length];
-        int i = 0;
-        for (long date : dates) {
-            time.set(date);
-            if (truncate) {
-                out[i] = time.format2445().substring(0, 8); // Just YYMMDD
-            } else {
-                out[i] = time.format2445().substring(0, 15); // YYMMDDThhmmss
-            }
-            ++i;
-        }
-        return out;
-    }
-
-    static final String PST = "America/Los_Angeles";
-    static final String UTC = "UTC";
-     // Use this date as end of recurrence unlessotherwise specified.
-    static final String DEFAULT_END = "20091212";
-
-    private void runRecurrenceIteratorTest(String rruleText, String dtStart, int limit,
-            String golden) throws Exception {
-        runRecurrenceIteratorTest(rruleText, dtStart, limit, golden, null, null, UTC);
-    }
-
-    private void runRecurrenceIteratorTest(String rrule, String dtstartStr, int limit,
-            String golden, String advanceTo, String tz) throws Exception {
-        runRecurrenceIteratorTest(rrule, dtstartStr, limit, golden, advanceTo, null, tz);
-    }
-
-    /**
-     * Tests a recurrence rule
-     * @param rrule The rule to expand
-     * @param dtstartStr The dtstart to use
-     * @param limit Maximum number of entries to expand.  if there are more, "..." is appended to
-     * the result.  Note that Android's recurrence expansion doesn't support expanding n results,
-     * so this is faked by expanding until the endAt date, and then taking limit results.
-     * @param golden The desired results
-     * @param advanceTo The starting date for expansion. dtstartStr is used if null is passed in.
-     * @param endAt The ending date.  DEFAULT_END is used if null is passed in.
-     * @param tz The time zone.  UTC is used if null is passed in.
-     * @throws Exception if anything goes wrong.
-     */
-    private void runRecurrenceIteratorTest(String rrule, String dtstartStr, int limit,
-            String golden, String advanceTo, String endAt, String tz) throws Exception {
-
-        String rdate = "";
-        String exrule = "";
-        String exdate = "";
-        rrule = rrule.replace("RRULE:", "");
-        // RecurrenceSet does not support folding of lines, so fold here
-        rrule = rrule.replace("\n ", "");
-
-        Time dtstart = new Time(tz);
-        Time rangeStart = new Time(tz);
-        Time rangeEnd = new Time(tz);
-        Time outCal = new Time(tz);
-
-        dtstart.parse(dtstartStr);
-        if (advanceTo == null) {
-            advanceTo = dtstartStr;
-        }
-        if (endAt == null) {
-            endAt = DEFAULT_END;
-        }
-
-        rangeStart.parse(advanceTo);
-        rangeEnd.parse(endAt);
-
-
-        RecurrenceProcessor rp = new RecurrenceProcessor();
-        RecurrenceSet recur = new RecurrenceSet(rrule, rdate, exrule, exdate);
-
-        long[] out = rp.expand(dtstart, recur, rangeStart.toMillis(false /* use isDst */),
-                rangeEnd.toMillis(false /* use isDst */));
-
-        if (METHOD_TRACE) {
-            Debug.stopMethodTracing();
-        }
-
-        boolean truncate = dtstartStr.length() <= 8; // Just date, not date-time
-        String[] actual = getFormattedDates(out, outCal, truncate);
-
-        StringBuilder sb = new StringBuilder();
-        int k = 0;
-        while (k < actual.length && --limit >= 0) {
-            if (k != 0) {
-                sb.append(',');
-            }
-            sb.append(actual[k]);
-            k++;
-        }
-        if (limit < 0) {
-            sb.append(",...");
-        }
-        assertEquals(golden, sb.toString());
-    }
-
-    // Infinite loop, bug 1662110
-    @SmallTest
-    public void testFrequencyLimits() throws Exception {
-        try {
-            runRecurrenceIteratorTest("RRULE:FREQ=SECONDLY;BYSECOND=0,1,2,3,4,5,6,7,8,9,10,11,12,13,14," + "15,16,17,18,19,20,21,22,23,24,25,26,27,28,29," + "30,31,32,33,34,35,36,37,38,39,40,41,42,43,44," + "45,46,47,48,49,50,51,52,53,54,55,56,57,58,59", "20000101", 1, "");
-            fail("Don't do that");
-        } catch (DateException ex) {
-            // pass
-        }
-    }
-
-    @SmallTest
-    public void testSimpleDaily() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=DAILY", "20060120", 5, "20060120,20060121,20060122,20060123,20060124,...");
-    }
-
-    @SmallTest
-    public void testSimpleWeekly() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=WEEKLY", "20060120", 5, "20060120,20060127,20060203,20060210,20060217,...");
-    }
-
-    @SmallTest
-    public void testSimpleMonthly() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=MONTHLY", "20060120", 5, "20060120,20060220,20060320,20060420,20060520,...");
-    }
-
-    @SmallTest
-    public void testSimpleYearly() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=YEARLY", "20060120", 5, "20060120,20070120,20080120,20090120,20100120,...", null, "20120101", UTC);
-    }
-
-    // from section 4.3.10
-    @SmallTest
-    public void testMultipleByParts() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=YEARLY;INTERVAL=2;BYMONTH=1;BYDAY=SU", "19970105", 8, "19970105,19970112,19970119,19970126," + "19990103,19990110,19990117,19990124,...");
-    }
-
-    @SmallTest
-    public void testCountWithInterval() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=DAILY;COUNT=10;INTERVAL=2", "19970105", 11, "19970105,19970107,19970109,19970111,19970113," + "19970115,19970117,19970119,19970121,19970123");
-    }
-
-    // from section 4.6.5
-    // Fails: wrong dates
-    @SmallTest
-    public void failingTestNegativeOffsetsA() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10", "19970105", 5, "19971026,19981025,19991031,20001029,20011028,...");
-    }
-
-    // Fails: wrong dates
-    @SmallTest
-    public void failingTestNegativeOffsetsB() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4", "19970105", 5, "19970406,19980405,19990404,20000402,20010401,...");
-    }
-    
-    // Fails: wrong dates
-    @SmallTest
-    public void failingTestNegativeOffsetsC() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4;UNTIL=19980404T150000Z", "19970105", 5, "19970406");
-    }
-
-    // feom section 4.8.5.4
-    @SmallTest
-    public void testDailyFor10Occ() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=DAILY;COUNT=10", "19970902T090000", 11, "19970902T090000,19970903T090000,19970904T090000,19970905T090000," + "19970906T090000,19970907T090000,19970908T090000,19970909T090000," + "19970910T090000,19970911T090000");
-
-    }
-
-    @SmallTest
-    public void testDailyUntilDec4() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=DAILY;UNTIL=19971204", "19971128", 11, "19971128,19971129,19971130,19971201,19971202,19971203,19971204");
-    }
-
-    // Fails: infinite loop
-    @SmallTest
-    public void failingTestEveryOtherDayForever() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=DAILY;INTERVAL=2", "19971128", 5, "19971128,19971130,19971202,19971204,19971206,...");
-    }
-
-    @SmallTest
-    public void testEvery10Days5Occ() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=DAILY;INTERVAL=10;COUNT=5", "19970902", 5, "19970902,19970912,19970922,19971002,19971012");
-    }
-
-    @SmallTest
-    public void testWeeklyFor10Occ() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=WEEKLY;COUNT=10", "19970902", 10, "19970902,19970909,19970916,19970923,19970930," + "19971007,19971014,19971021,19971028,19971104");
-    }
-
-    @SmallTest
-    public void testWeeklyUntilDec24() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=WEEKLY;UNTIL=19971224", "19970902", 25, "19970902,19970909,19970916,19970923,19970930," + "19971007,19971014,19971021,19971028,19971104," + "19971111,19971118,19971125,19971202,19971209," + "19971216,19971223");
-    }
-
-    @SmallTest
-    public void testEveryOtherWeekForever() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=WEEKLY;INTERVAL=2;WKST=SU", "19970902", 11, "19970902,19970916,19970930,19971014,19971028," + "19971111,19971125,19971209,19971223,19980106," + "19980120,...");
-    }
-
-    @SmallTest
-    public void testWeeklyOnTuesdayAndThursdayFor5Weeks() throws Exception {
-        // if UNTIL date does not match start date, then until date treated as
-        // occurring on midnight.
-        runRecurrenceIteratorTest("RRULE:FREQ=WEEKLY;UNTIL=19971007;WKST=SU;BYDAY=TU,TH", "19970902T090000", 11, "19970902T090000,19970904T090000,19970909T090000,19970911T090000," + "19970916T090000,19970918T090000,19970923T090000,19970925T090000," + "19970930T090000,19971002T090000");
-        runRecurrenceIteratorTest("RRULE:FREQ=WEEKLY;UNTIL=19971007T000000Z;WKST=SU;BYDAY=TU,TH", "19970902T090000", 11, "19970902T090000,19970904T090000,19970909T090000,19970911T090000," + "19970916T090000,19970918T090000,19970923T090000,19970925T090000," + "19970930T090000,19971002T090000");
-        runRecurrenceIteratorTest("RRULE:FREQ=WEEKLY;COUNT=10;WKST=SU;BYDAY=TU,TH", "19970902", 11, "19970902,19970904,19970909,19970911,19970916," + "19970918,19970923,19970925,19970930,19971002");
-    }
-
-    @SmallTest
-    public void testEveryOtherWeekOnMWFUntilDec24() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;WKST=SU;\n" + " BYDAY=MO,WE,FR", "19970903T090000", 25, "19970903T090000,19970905T090000,19970915T090000,19970917T090000," + "19970919T090000,19970929T090000,19971001T090000,19971003T090000," + "19971013T090000,19971015T090000,19971017T090000,19971027T090000," + "19971029T090000,19971031T090000,19971110T090000,19971112T090000," + "19971114T090000,19971124T090000,19971126T090000,19971128T090000," + "19971208T090000,19971210T090000,19971212T090000,19971222T090000");
-    }
-
-    @SmallTest
-    public void testEveryOtherWeekOnMWFUntilDec24a() throws Exception {
-        // if the UNTIL date is timed, when the start is not, the time should be
-        // ignored, so we get one more instance
-        runRecurrenceIteratorTest("RRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;WKST=SU;\n" + " BYDAY=MO,WE,FR", "19970903", 25, "19970903,19970905,19970915,19970917," + "19970919,19970929,19971001,19971003," + "19971013,19971015,19971017,19971027," + "19971029,19971031,19971110,19971112," + "19971114,19971124,19971126,19971128," + "19971208,19971210,19971212,19971222," + "19971224");
-    }
-
-    // Fails with wrong times
-    @SmallTest
-    public void failingTestEveryOtherWeekOnMWFUntilDec24b() throws Exception {
-        // test with an alternate timezone
-        runRecurrenceIteratorTest("RRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T090000Z;WKST=SU;\n" + " BYDAY=MO,WE,FR", "19970903T090000", 25, "19970903T160000,19970905T160000,19970915T160000,19970917T160000," + "19970919T160000,19970929T160000,19971001T160000,19971003T160000," + "19971013T160000,19971015T160000,19971017T160000,19971027T170000," + "19971029T170000,19971031T170000,19971110T170000,19971112T170000," + "19971114T170000,19971124T170000,19971126T170000,19971128T170000," + "19971208T170000,19971210T170000,19971212T170000,19971222T170000", null,  PST);
-    }
-
-    @SmallTest
-    public void testEveryOtherWeekOnTuThFor8Occ() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=WEEKLY;INTERVAL=2;COUNT=8;WKST=SU;BYDAY=TU,TH", "19970902", 8, "19970902,19970904,19970916,19970918,19970930," + "19971002,19971014,19971016");
-    }
-
-    @SmallTest
-    public void testMonthlyOnThe1stFridayFor10Occ() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=MONTHLY;COUNT=10;BYDAY=1FR", "19970905", 10, "19970905,19971003,19971107,19971205,19980102," + "19980206,19980306,19980403,19980501,19980605");
-    }
-
-    @SmallTest
-    public void testMonthlyOnThe1stFridayUntilDec24() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=MONTHLY;UNTIL=19971224T000000Z;BYDAY=1FR", "19970905", 4, "19970905,19971003,19971107,19971205");
-    }
-
-    @SmallTest
-    public void testEveryOtherMonthOnThe1stAndLastSundayFor10Occ() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=MONTHLY;INTERVAL=2;COUNT=10;BYDAY=1SU,-1SU", "19970907", 10, "19970907,19970928,19971102,19971130,19980104," + "19980125,19980301,19980329,19980503,19980531");
-    }
-
-    @SmallTest
-    public void testMonthlyOnTheSecondToLastMondayOfTheMonthFor6Months() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=MONTHLY;COUNT=6;BYDAY=-2MO", "19970922", 6, "19970922,19971020,19971117,19971222,19980119," + "19980216");
-    }
-
-    @SmallTest
-    public void testMonthlyOnTheThirdToLastDay() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=MONTHLY;BYMONTHDAY=-3", "19970928", 6, "19970928,19971029,19971128,19971229,19980129,19980226,...");
-    }
-
-    @SmallTest
-    public void testMonthlyOnThe2ndAnd15thFor10Occ() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=MONTHLY;COUNT=10;BYMONTHDAY=2,15", "19970902", 10, "19970902,19970915,19971002,19971015,19971102," + "19971115,19971202,19971215,19980102,19980115");
-    }
-
-    @SmallTest
-    public void testMonthlyOnTheFirstAndLastFor10Occ() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=MONTHLY;COUNT=10;BYMONTHDAY=1,-1", "19970930", 10, "19970930,19971001,19971031,19971101,19971130," + "19971201,19971231,19980101,19980131,19980201");
-    }
-
-    @SmallTest
-    public void testEvery18MonthsOnThe10thThru15thFor10Occ() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=MONTHLY;INTERVAL=18;COUNT=10;BYMONTHDAY=10,11,12,13,14,\n" + " 15", "19970910", 10, "19970910,19970911,19970912,19970913,19970914," + "19970915,19990310,19990311,19990312,19990313");
-    }
-
-    @SmallTest
-    public void testEveryTuesdayEveryOtherMonth() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=MONTHLY;INTERVAL=2;BYDAY=TU", "19970902", 18, "19970902,19970909,19970916,19970923,19970930," + "19971104,19971111,19971118,19971125,19980106," + "19980113,19980120,19980127,19980303,19980310," + "19980317,19980324,19980331,...");
-    }
-
-    @SmallTest
-    public void testYearlyInJuneAndJulyFor10Occurrences() throws Exception {
-        // Note: Since none of the BYDAY, BYMONTHDAY or BYYEARDAY components
-        // are specified, the day is gotten from DTSTART
-        runRecurrenceIteratorTest("RRULE:FREQ=YEARLY;COUNT=10;BYMONTH=6,7", "19970610", 10, "19970610,19970710,19980610,19980710,19990610," + "19990710,20000610,20000710,20010610,20010710");
-    }
-
-    @SmallTest
-    public void testEveryOtherYearOnJanuaryFebruaryAndMarchFor10Occurrences() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=YEARLY;INTERVAL=2;COUNT=10;BYMONTH=1,2,3", "19970310", 10, "19970310,19990110,19990210,19990310,20010110," + "20010210,20010310,20030110,20030210,20030310");
-    }
-
-    //Fails: wrong dates
-    @SmallTest
-    public void failingTestEvery3rdYearOnThe1st100thAnd200thDayFor10Occurrences() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=YEARLY;INTERVAL=3;COUNT=10;BYYEARDAY=1,100,200", "19970101", 10, "19970101,19970410,19970719,20000101,20000409," + "20000718,20030101,20030410,20030719,20060101");
-    }
-
-    // Fails: infinite loop
-    @SmallTest
-    public void failingTestEvery20thMondayOfTheYearForever() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=YEARLY;BYDAY=20MO", "19970519", 3, "19970519,19980518,19990517,...");
-    }
-
-    // Fails: generates wrong dates
-    @SmallTest
-    public void failingTestMondayOfWeekNumber20WhereTheDefaultStartOfTheWeekIsMonday() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=YEARLY;BYWEEKNO=20;BYDAY=MO", "19970512", 3, "19970512,19980511,19990517,...");
-    }
-
-    @SmallTest
-    public void testEveryThursdayInMarchForever() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=TH", "19970313", 11, "19970313,19970320,19970327,19980305,19980312," + "19980319,19980326,19990304,19990311,19990318," + "19990325,...");
-    }
-
-    //Fails: wrong dates
-    @SmallTest
-    public void failingTestEveryThursdayButOnlyDuringJuneJulyAndAugustForever() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=YEARLY;BYDAY=TH;BYMONTH=6,7,8", "19970605", 39, "19970605,19970612,19970619,19970626,19970703," + "19970710,19970717,19970724,19970731,19970807," + "19970814,19970821,19970828,19980604,19980611," + "19980618,19980625,19980702,19980709,19980716," + "19980723,19980730,19980806,19980813,19980820," + "19980827,19990603,19990610,19990617,19990624," + "19990701,19990708,19990715,19990722,19990729," + "19990805,19990812,19990819,19990826,...");
-    }
-
-    //Fails: infinite loop
-    @SmallTest
-    public void failingTestEveryFridayThe13thForever() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=MONTHLY;BYDAY=FR;BYMONTHDAY=13", "19970902", 5, "19980213,19980313,19981113,19990813,20001013," + "...");
-    }
-
-    @SmallTest
-    public void testTheFirstSaturdayThatFollowsTheFirstSundayOfTheMonthForever() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=MONTHLY;BYDAY=SA;BYMONTHDAY=7,8,9,10,11,12,13", "19970913", 10, "19970913,19971011,19971108,19971213,19980110," + "19980207,19980307,19980411,19980509,19980613," + "...");
-    }
-
-    @SmallTest
-    public void testEvery4YearsThe1stTuesAfterAMonInNovForever() throws Exception {
-        // US Presidential Election Day
-        runRecurrenceIteratorTest("RRULE:FREQ=YEARLY;INTERVAL=4;BYMONTH=11;BYDAY=TU;BYMONTHDAY=2,3,4,\n" + " 5,6,7,8", "19961105", 3, "19961105,20001107,20041102,...");
-    }
-
-    // Fails: wrong dates
-    @SmallTest
-    public void failingTestThe3rdInstanceIntoTheMonthOfOneOfTuesWedThursForNext3Months() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=MONTHLY;COUNT=3;BYDAY=TU,WE,TH;BYSETPOS=3", "19970904", 3, "19970904,19971007,19971106");
-    }
-
-    // Fails: wrong dates
-    @SmallTest
-    public void failingTestThe2ndToLastWeekdayOfTheMonth() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-2", "19970929", 7, "19970929,19971030,19971127,19971230,19980129," + "19980226,19980330,...");
-    }
-
-    // Fails: infinite loop
-    @SmallTest
-    public void failingTestEvery3HoursFrom900AmTo500PmOnASpecificDay() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=HOURLY;INTERVAL=3;UNTIL=19970903T010000Z", "19970902", 7, "00000902,19970909,19970900,19970912,19970900," + "19970915,19970900");
-    }
-
-    // Fails: infinite loop
-    @SmallTest
-    public void failingTestEvery15MinutesFor6Occurrences() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=MINUTELY;INTERVAL=15;COUNT=6", "19970902", 13, "00000902,19970909,19970900,19970909,19970915," + "19970909,19970930,19970909,19970945,19970910," + "19970900,19970910,19970915");
-    }
-
-    @SmallTest
-    public void failingTestEveryHourAndAHalfFor4Occurrences() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=MINUTELY;INTERVAL=90;COUNT=4", "19970902", 9, "00000902,19970909,19970900,19970910,19970930," + "19970912,19970900,19970913,19970930");
-    }
-
-    // Fails: wrong dates
-    @SmallTest
-    public void failingTestAnExampleWhereTheDaysGeneratedMakesADifferenceBecauseOfWkst() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=WEEKLY;INTERVAL=2;COUNT=4;BYDAY=TU,SU;WKST=MO", "19970805", 4, "19970805,19970810,19970819,19970824");
-    }
-
-    // Fails: wrong dates
-    @SmallTest
-    public void failingTestAnExampleWhereTheDaysGeneratedMakesADifferenceBecauseOfWkst2() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=WEEKLY;INTERVAL=2;COUNT=4;BYDAY=TU,SU;WKST=SU", "19970805", 8, "19970805,19970817,19970819,19970831");
-    }
-
-    // Fails: wrong dates
-    @SmallTest
-    public void failingTestWithByDayAndByMonthDayFilter() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=WEEKLY;COUNT=4;BYDAY=TU,SU;" + "BYMONTHDAY=13,14,15,16,17,18,19,20", "19970805", 8, "19970817,19970819,19970914,19970916");
-    }
-
-    // Failed: wrong dates
-    @SmallTest
-    public void failingTestAnnuallyInAugustOnTuesAndSunBetween13thAnd20th() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=YEARLY;COUNT=4;BYDAY=TU,SU;" + "BYMONTHDAY=13,14,15,16,17,18,19,20;BYMONTH=8", "19970605", 8, "19970817,19970819,19980816,19980818");
-    }
-
-    // Failed: wrong dates
-    @SmallTest
-    public void failingTestLastDayOfTheYearIsASundayOrTuesday() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=YEARLY;COUNT=4;BYDAY=TU,SU;BYYEARDAY=-1", "19940605", 8, "19951231,19961231,20001231,20021231");
-    }
-
-    // Fails: wrong dates
-    @SmallTest
-    public void failingTestLastWeekdayOfMonth() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=MONTHLY;BYSETPOS=-1;BYDAY=-1MO,-1TU,-1WE,-1TH,-1FR", "19940605", 8, "19940630,19940729,19940831,19940930," + "19941031,19941130,19941230,19950131,...");
-    }
-
-    // Fails: generates wrong dates
-    @SmallTest
-    public void failingTestMonthsThatStartOrEndOnFriday() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=MONTHLY;BYMONTHDAY=1,-1;BYDAY=FR;COUNT=6", "19940605", 8, "19940701,19940930,19950331,19950630,19950901,19951201");
-    }
-
-    // Fails: can't go that far into future
-    @SmallTest
-    public void failingTestCenturiesThatAreNotLeapYears() throws Exception {
-        // I can't think of a good reason anyone would want to specify both a
-        // month day and a year day, so here's a really contrived example
-        runRecurrenceIteratorTest("RRULE:FREQ=YEARLY;INTERVAL=100;BYYEARDAY=60;BYMONTHDAY=1", "19000101", 4, "19000301,21000301,22000301,23000301,...", null, "25000101", UTC);
-    }
-
-    // Fails: generates instances when it shouldn't
-    @SmallTest
-    public void failingTestNoInstancesGenerated() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=DAILY;UNTIL=19990101", "20000101", 4, "");
-    }
-
-    // Fails: generates instances when it shouldn't
-    @SmallTest
-    public void failingTestNoInstancesGenerated2() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=YEARLY;BYMONTH=2;BYMONTHDAY=30", "20000101", 4, "");
-    }
-
-    // Fails: generates instances when it shouldn't
-    @SmallTest
-    public void failingTestNoInstancesGenerated3() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=YEARLY;INTERVAL=4;BYYEARDAY=366", "20000101", 4, "");
-    }
-
-    //Fails: wrong dates
-    @SmallTest
-    public void failingTestLastWeekdayOfMarch() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=MONTHLY;BYMONTH=3;BYDAY=SA,SU;BYSETPOS=-1", "20000101", 4, "20000326,20010331,20020331,20030330,...");
-    }
-
-    // Fails: wrong dates
-    @SmallTest
-    public void failingTestFirstWeekdayOfMarch() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=MONTHLY;BYMONTH=3;BYDAY=SA,SU;BYSETPOS=1", "20000101", 4, "20000304,20010303,20020302,20030301,...");
-    }
-
-    //     January 1999
-    // Mo Tu We Th Fr Sa Su
-    //              1  2  3    // < 4 days, so not a week
-    //  4  5  6  7  8  9 10
-
-    //     January 2000
-    // Mo Tu We Th Fr Sa Su
-    //                 1  2    // < 4 days, so not a week
-    //  3  4  5  6  7  8  9
-
-    //     January 2001
-    // Mo Tu We Th Fr Sa Su
-    //  1  2  3  4  5  6  7
-    //  8  9 10 11 12 13 14
-
-    //     January 2002
-    // Mo Tu We Th Fr Sa Su
-    //     1  2  3  4  5  6
-    //  7  8  9 10 11 12 13
-
-    /**
-     * Find the first weekday of the first week of the year.
-     * The first week of the year may be partial, and the first week is considered
-     * to be the first one with at least four days.
-     */
-    // Fails: wrong dates
-    @SmallTest
-    public void failingTestFirstWeekdayOfFirstWeekOfYear() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=YEARLY;BYWEEKNO=1;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=1", "19990101", 4, "19990104,20000103,20010101,20020101,...");
-    }
-
-    // Fails: wrong dates
-    @SmallTest
-    public void failingTestFirstSundayOfTheYear1() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=YEARLY;BYWEEKNO=1;BYDAY=SU", "19990101", 4, "19990110,20000109,20010107,20020106,...");
-    }
-
-    // Fails: wrong dates
-    @SmallTest
-    public void failingTestFirstSundayOfTheYear2() throws Exception {
-        // TODO(msamuel): is this right?
-        runRecurrenceIteratorTest("RRULE:FREQ=YEARLY;BYDAY=1SU", "19990101", 4, "19990103,20000102,20010107,20020106,...");
-    }
-
-    // Fails: wrong dates
-    @SmallTest
-    public void failingTestFirstSundayOfTheYear3() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=YEARLY;BYDAY=SU;BYYEARDAY=1,2,3,4,5,6,7,8,9,10,11,12,13" + ";BYSETPOS=1", "19990101", 4, "19990103,20000102,20010107,20020106,...");
-    }
-
-    // Fails: wrong dates
-    @SmallTest
-    public void failingTestFirstWeekdayOfYear() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=YEARLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=1", "19990101", 4, "19990101,20000103,20010101,20020101,...");
-    }
-
-    // Fails: wrong dates
-    @SmallTest
-    public void failingTestLastWeekdayOfFirstWeekOfYear() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=YEARLY;BYWEEKNO=1;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-1", "19990101", 4, "19990108,20000107,20010105,20020104,...");
-    }
-
-    //     January 1999
-    // Mo Tu We Th Fr Sa Su
-    //              1  2  3
-    //  4  5  6  7  8  9 10
-    // 11 12 13 14 15 16 17
-    // 18 19 20 21 22 23 24
-    // 25 26 27 28 29 30 31
-
-    // Fails: wrong dates
-    @SmallTest
-    public void failingestSectesondWeekday1() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=2", "19990101", 4, "19990105,19990112,19990119,19990126,...");
-    }
-
-    //     January 1997
-    // Mo Tu We Th Fr Sa Su
-    //        1  2  3  4  5
-    //  6  7  8  9 10 11 12
-    // 13 14 15 16 17 18 19
-    // 20 21 22 23 24 25 26
-    // 27 28 29 30 31
-
-    // Fails: wrong dates
-    @SmallTest
-    public void failingTestSecondWeekday2() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=2", "19970101", 4, "19970102,19970107,19970114,19970121,...");
-    }
-
-    // Fails: wrong dates
-    @SmallTest
-    public void failingTestByYearDayAndByDayFilterInteraction() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=YEARLY;BYYEARDAY=15;BYDAY=3MO", "19990101", 4, "20010115,20070115,20180115,20240115,...");
-    }
-
-    // Fails: wrong dates
-    @SmallTest
-    public void failingTestByDayWithNegWeekNoAsFilter() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=MONTHLY;BYMONTHDAY=26;BYDAY=-1FR", "19990101", 4, "19990226,19990326,19991126,20000526,...");
-    }
-
-    // Fails: wrong dates
-    @SmallTest
-    public void failingTestLastWeekOfTheYear() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=YEARLY;BYWEEKNO=-1", "19990101", 6, "19991227,19991228,19991229,19991230,19991231,20001225,...");
-    }
-
-    // Fails: not enough dates generated
-    @SmallTest
-    public void failingTestUserSubmittedTest1() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=WEEKLY;INTERVAL=2;WKST=WE;BYDAY=SU,TU,TH,SA" + ";UNTIL=20000215T113000Z", "20000127T033000", 20, "20000127T033000,20000129T033000,20000130T033000,20000201T033000," + "20000210T033000,20000212T033000,20000213T033000,20000215T033000");
-    }
-
-    @SmallTest
-    public void testAdvanceTo1() throws Exception {
-        // a bunch of tests grabbed from above with an advance-to date tacked on
-
-        runRecurrenceIteratorTest("RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=TH", "19970313", 11,
-                /*"19970313,19970320,19970327,"*/"19980305,19980312," + "19980319,19980326,19990304,19990311,19990318," + "19990325,20000302,20000309,20000316,...", "19970601", UTC);
-    }
-
-    // Fails: infinite loop
-    @SmallTest
-    public void failingTestAdvanceTo2() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=YEARLY;BYDAY=20MO", "19970519", 3,
-                /*"19970519,"*/"19980518,19990517,20000515,...", "19980515", UTC);
-    }
-
-    // Fails: wrong dates
-    @SmallTest
-    public void failingTestAdvanceTo3() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=YEARLY;INTERVAL=3;UNTIL=20090101;BYYEARDAY=1,100,200", "19970101", 10,
-                /*"19970101,19970410,19970719,20000101,"*/"20000409," + "20000718,20030101,20030410,20030719,20060101,20060410,20060719," + "20090101", "20000228", UTC);
-    }
-
-    //Fails: wrong dates
-    @SmallTest
-    public void failingTestAdvanceTo4() throws Exception {
-        // make sure that count preserved
-        runRecurrenceIteratorTest("RRULE:FREQ=YEARLY;INTERVAL=3;COUNT=10;BYYEARDAY=1,100,200", "19970101", 10,
-                /*"19970101,19970410,19970719,20000101,"*/"20000409," + "20000718,20030101,20030410,20030719,20060101", "20000228", UTC);
-    }
-
-    // Fails: too many dates
-    @SmallTest
-    public void FailingTestAdvanceTo5() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=YEARLY;INTERVAL=2;COUNT=10;BYMONTH=1,2,3", "19970310", 10,
-                /*"19970310,"*/"19990110,19990210,19990310,20010110," + "20010210,20010310,20030110,20030210,20030310", "19980401", UTC);
-    }
-
-    @SmallTest
-    public void testAdvanceTo6() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=WEEKLY;UNTIL=19971224", "19970902", 25,
-                /*"19970902,19970909,19970916,19970923,"*/"19970930," + "19971007,19971014,19971021,19971028,19971104," + "19971111,19971118,19971125,19971202,19971209," + "19971216,19971223", "19970930", UTC);
-    }
-
-    @SmallTest
-    public void testAdvanceTo7() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=MONTHLY;INTERVAL=18;BYMONTHDAY=10,11,12,13,14,\n" + " 15", "19970910", 5,
-                /*"19970910,19970911,19970912,19970913,19970914," +
-                "19970915,"*/"19990310,19990311,19990312,19990313,19990314,...", "19990101", UTC);
-    }
-
-    @SmallTest
-    public void testAdvanceTo8() throws Exception {
-        // advancing into the past
-        runRecurrenceIteratorTest("RRULE:FREQ=MONTHLY;INTERVAL=18;BYMONTHDAY=10,11,12,13,14,\n" + " 15", "19970910", 11, "19970910,19970911,19970912,19970913,19970914," + "19970915,19990310,19990311,19990312,19990313,19990314,...", "19970901", UTC);
-    }
-
-    // Fails: wrong dates
-    @SmallTest
-    public void failingTestAdvanceTo9() throws Exception {
-        // skips first instance
-        runRecurrenceIteratorTest("RRULE:FREQ=YEARLY;INTERVAL=100;BYMONTH=2;BYMONTHDAY=29", "19000101", 5,
-                // would return 2000
-                "24000229,28000229,32000229,36000229,40000229,...", "20040101", UTC);
-    }
-
-    @SmallTest
-    public void testAdvanceTo10() throws Exception {
-        // filter hits until date before first instnace
-        runRecurrenceIteratorTest("RRULE:FREQ=YEARLY;INTERVAL=100;BYMONTH=2;BYMONTHDAY=29;UNTIL=21000101", "19000101", 5, "", "20040101", UTC);
-    }
-
-    // Fails: generates wrong dates
-    @SmallTest
-    public void failingTestAdvanceTo11() throws Exception {
-        // advancing something that returns no instances
-        runRecurrenceIteratorTest("RRULE:FREQ=YEARLY;BYMONTH=2;BYMONTHDAY=30", "20000101", 10, "", "19970901", UTC);
-    }
-
-    // Fails: generates wrong dates
-    @SmallTest
-    public void failingTestAdvanceTo12() throws Exception {
-        // advancing something that returns no instances and has a BYSETPOS rule
-        runRecurrenceIteratorTest("RRULE:FREQ=YEARLY;BYMONTH=2;BYMONTHDAY=30,31;BYSETPOS=1", "20000101", 10, "", "19970901", UTC);
-    }
-
-    // Fails: generates wrong dates
-    @SmallTest
-    public void failingTestAdvanceTo13() throws Exception {
-        // advancing way past year generator timeout
-        runRecurrenceIteratorTest("RRULE:FREQ=YEARLY;BYMONTH=2;BYMONTHDAY=28", "20000101", 10, "", "25000101", UTC);
-    }
-
-    /**
-     * a testcase that yielded dupes due to bysetPos evilness
-     */
-    @SmallTest
-    public void infiniteTestCaseThatYieldedDupes() throws Exception {
-        runRecurrenceIteratorTest("RRULE:FREQ=WEEKLY;WKST=SU;INTERVAL=1;BYMONTH=9,1,12,8" + ";BYMONTHDAY=-9,-29,24;BYSETPOS=-1,-4,10,-6,-1,-10,-10,-9,-8", "20060528", 200, "20060924,20061203,20061224,20070902,20071223,20080803,20080824," + "20090823,20100103,20100124,20110123,20120902,20121223,20130922," + "20140803,20140824,20150823,20160103,20160124,20170924,20171203," + "20171224,20180902,20181223,20190922,20200823,20210103,20210124," + "20220123,20230924,20231203,20231224,20240922,20250803,20250824," + "20260823,20270103,20270124,20280123,20280924,20281203,20281224," + "20290902,20291223,20300922,20310803,20310824,20330123,20340924," + "20341203,20341224,20350902,20351223,20360803,20360824,20370823," + "20380103,20380124,20390123,20400902,20401223,20410922,20420803," + "20420824,20430823,20440103,20440124,20450924,20451203,20451224," + "20460902,20461223,20470922,20480823,20490103,20490124,20500123," + "20510924,20511203,20511224,20520922,20530803,20530824,20540823," + "20550103,20550124,20560123,20560924,20561203,20561224,20570902," + "20571223,20580922,20590803,20590824,20610123,20620924,20621203," + "20621224,20630902,20631223,20640803,20640824,20650823,20660103," + "20660124,20670123,20680902,20681223,20690922,20700803,20700824," + "20710823,20720103,20720124,20730924,20731203,20731224,20740902," + "20741223,20750922,20760823,20770103,20770124,20780123,20790924," + "20791203,20791224,20800922,20810803,20810824,20820823,20830103," + "20830124,20840123,20840924,20841203,20841224,20850902,20851223," + "20860922,20870803,20870824,20890123,20900924,20901203,20901224," + "20910902,20911223,20920803,20920824,20930823,20940103,20940124," + "20950123,20960902,20961223,20970922,20980803,20980824,20990823," + "21000103,21000124,21010123,21020924,21021203,21021224,21030902," + "21031223,21040803,21040824,21050823,21060103,21060124,21070123," + "21080902,21081223,21090922,21100803,21100824,21110823,21120103," + "21120124,21130924,21131203,21131224,21140902,21141223,21150922," + "21160823,21170103,21170124,21180123,21190924,21191203,21191224," + "21200922,21210803,21210824,21220823,...");
-    }
-}
