eclair snapshot
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index c6c0b6f..d731009 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -6,13 +6,16 @@
     <uses-permission android:name="android.permission.VIBRATE"/>
     <uses-permission android:name="android.permission.WRITE_SETTINGS" />
     <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
 
     <application android:label="@string/app_label"
                  android:icon="@drawable/ic_launcher_alarmclock">
 
         <provider android:name="AlarmProvider" android:authorities="com.android.alarmclock" />
 
-        <activity android:name="AlarmClock" android:label="@string/app_label">
+        <activity android:name="AlarmClock" android:label="@string/app_label"
+                android:icon="@drawable/ic_widget_analog_clock"
+                android:configChanges="orientation|keyboardHidden|keyboard|navigation">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.DEFAULT" />
@@ -26,14 +29,14 @@
             </intent-filter>
         </activity>
 
-        <activity android:name="SetAlarm" android:label="@string/set_alarm" />
+        <activity android:name="SetAlarm" android:label="@string/set_alarm"
+                android:configChanges="orientation|keyboardHidden|keyboard|navigation" />
 
         <activity android:name="AlarmAlert"
                 android:excludeFromRecents="true"
                 android:theme="@style/alarm_alert"
-                android:launchMode="singleTask"
-                android:taskAffinity=":AlarmAlert"
-                android:screenOrientation="portrait"
+                android:launchMode="singleInstance"
+                android:taskAffinity=""
                 android:configChanges="orientation|keyboardHidden|keyboard|navigation"/>
 
         <!-- This activity is basically the same as AlarmAlert but with a more
@@ -41,10 +44,9 @@
              with the wallpaper background. -->
         <activity android:name="AlarmAlertFullScreen"
                 android:excludeFromRecents="true"
-                android:theme="@android:style/Theme.NoTitleBar"
-                android:launchMode="singleTask"
-                android:taskAffinity=":AlarmAlert"
-                android:screenOrientation="portrait"
+                android:theme="@android:style/Theme.Wallpaper.NoTitleBar"
+                android:launchMode="singleInstance"
+                android:taskAffinity=""
                 android:configChanges="orientation|keyboardHidden|keyboard|navigation"/>
 
         <activity android:name="ClockPicker" />
@@ -52,9 +54,23 @@
         <receiver android:name="AlarmReceiver">
             <intent-filter>
                <action android:name="com.android.alarmclock.ALARM_ALERT" />
+               <action android:name="alarm_killed" />
+               <action android:name="cancel_snooze" />
             </intent-filter>
         </receiver>
 
+        <!-- This service receives the same intent as AlarmReceiver but it does
+             not respond to the same broadcast. The AlarmReceiver will receive
+             the alert broadcast and will start this service with the same
+             intent. The service plays the alarm alert and vibrates the device.
+             This allows the alert to continue playing even if another activity
+             causes the AlarmAlert activity to pause. -->
+        <service android:name="AlarmKlaxon">
+            <intent-filter>
+                <action android:name="com.android.alarmclock.ALARM_ALERT" />
+            </intent-filter>
+        </service>
+
         <receiver android:name="AlarmInitReceiver">
             <intent-filter>
                 <action android:name="android.intent.action.BOOT_COMPLETED" />
@@ -63,7 +79,8 @@
             </intent-filter>
         </receiver>
 
-        <receiver android:name="AnalogAppWidgetProvider" android:label="@string/analog_gadget">
+        <receiver android:name="AnalogAppWidgetProvider" android:label="@string/analog_gadget"
+        	android:icon="@drawable/ic_widget_analog_clock">
             <intent-filter>
                 <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
             </intent-filter>
diff --git a/res/drawable-hdpi/appwidget_clock_dial.png b/res/drawable-hdpi/appwidget_clock_dial.png
new file mode 100644
index 0000000..d004264
--- /dev/null
+++ b/res/drawable-hdpi/appwidget_clock_dial.png
Binary files differ
diff --git a/res/drawable-hdpi/appwidget_clock_hour.png b/res/drawable-hdpi/appwidget_clock_hour.png
new file mode 100644
index 0000000..d60a34c
--- /dev/null
+++ b/res/drawable-hdpi/appwidget_clock_hour.png
Binary files differ
diff --git a/res/drawable-hdpi/appwidget_clock_minute.png b/res/drawable-hdpi/appwidget_clock_minute.png
new file mode 100644
index 0000000..487296c
--- /dev/null
+++ b/res/drawable-hdpi/appwidget_clock_minute.png
Binary files differ
diff --git a/res/drawable-hdpi/circle0.png b/res/drawable-hdpi/circle0.png
new file mode 100644
index 0000000..95b199e
--- /dev/null
+++ b/res/drawable-hdpi/circle0.png
Binary files differ
diff --git a/res/drawable-hdpi/circle1.png b/res/drawable-hdpi/circle1.png
new file mode 100644
index 0000000..2312efb
--- /dev/null
+++ b/res/drawable-hdpi/circle1.png
Binary files differ
diff --git a/res/drawable-hdpi/circle2.png b/res/drawable-hdpi/circle2.png
new file mode 100644
index 0000000..0e3e8ce
--- /dev/null
+++ b/res/drawable-hdpi/circle2.png
Binary files differ
diff --git a/res/drawable-hdpi/circle3.png b/res/drawable-hdpi/circle3.png
new file mode 100644
index 0000000..809d614
--- /dev/null
+++ b/res/drawable-hdpi/circle3.png
Binary files differ
diff --git a/res/drawable-hdpi/clock_dial.png b/res/drawable-hdpi/clock_dial.png
new file mode 100644
index 0000000..f175a5b
--- /dev/null
+++ b/res/drawable-hdpi/clock_dial.png
Binary files differ
diff --git a/res/drawable-hdpi/clock_hour.png b/res/drawable-hdpi/clock_hour.png
new file mode 100644
index 0000000..65076c3
--- /dev/null
+++ b/res/drawable-hdpi/clock_hour.png
Binary files differ
diff --git a/res/drawable-hdpi/clock_minute.png b/res/drawable-hdpi/clock_minute.png
new file mode 100644
index 0000000..95c0ffc
--- /dev/null
+++ b/res/drawable-hdpi/clock_minute.png
Binary files differ
diff --git a/res/drawable-hdpi/clockdroid2_dial.png b/res/drawable-hdpi/clockdroid2_dial.png
new file mode 100644
index 0000000..8efc022
--- /dev/null
+++ b/res/drawable-hdpi/clockdroid2_dial.png
Binary files differ
diff --git a/res/drawable-hdpi/clockdroid2_hour.png b/res/drawable-hdpi/clockdroid2_hour.png
new file mode 100644
index 0000000..af381bb
--- /dev/null
+++ b/res/drawable-hdpi/clockdroid2_hour.png
Binary files differ
diff --git a/res/drawable-hdpi/clockdroid2_minute.png b/res/drawable-hdpi/clockdroid2_minute.png
new file mode 100644
index 0000000..554a393
--- /dev/null
+++ b/res/drawable-hdpi/clockdroid2_minute.png
Binary files differ
diff --git a/res/drawable-hdpi/clockdroids_dial.png b/res/drawable-hdpi/clockdroids_dial.png
new file mode 100644
index 0000000..0db5af5
--- /dev/null
+++ b/res/drawable-hdpi/clockdroids_dial.png
Binary files differ
diff --git a/res/drawable-hdpi/clockdroids_hour.png b/res/drawable-hdpi/clockdroids_hour.png
new file mode 100644
index 0000000..27b2cbf
--- /dev/null
+++ b/res/drawable-hdpi/clockdroids_hour.png
Binary files differ
diff --git a/res/drawable-hdpi/clockdroids_minute.png b/res/drawable-hdpi/clockdroids_minute.png
new file mode 100644
index 0000000..c4acc0d
--- /dev/null
+++ b/res/drawable-hdpi/clockdroids_minute.png
Binary files differ
diff --git a/res/drawable-hdpi/clockgoog_dial.png b/res/drawable-hdpi/clockgoog_dial.png
new file mode 100644
index 0000000..2d2140e
--- /dev/null
+++ b/res/drawable-hdpi/clockgoog_dial.png
Binary files differ
diff --git a/res/drawable-hdpi/clockgoog_hour.png b/res/drawable-hdpi/clockgoog_hour.png
new file mode 100644
index 0000000..c6af09f
--- /dev/null
+++ b/res/drawable-hdpi/clockgoog_hour.png
Binary files differ
diff --git a/res/drawable-hdpi/clockgoog_minute.png b/res/drawable-hdpi/clockgoog_minute.png
new file mode 100644
index 0000000..b04f3e5
--- /dev/null
+++ b/res/drawable-hdpi/clockgoog_minute.png
Binary files differ
diff --git a/res/drawable-hdpi/dialog.9.png b/res/drawable-hdpi/dialog.9.png
new file mode 100644
index 0000000..16ca7e6
--- /dev/null
+++ b/res/drawable-hdpi/dialog.9.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_launcher_alarmclock.png b/res/drawable-hdpi/ic_launcher_alarmclock.png
new file mode 100644
index 0000000..99764c6
--- /dev/null
+++ b/res/drawable-hdpi/ic_launcher_alarmclock.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_clock_face.png b/res/drawable-hdpi/ic_menu_clock_face.png
new file mode 100644
index 0000000..b6e7d1b
--- /dev/null
+++ b/res/drawable-hdpi/ic_menu_clock_face.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_widget_analog_clock.png b/res/drawable-hdpi/ic_widget_analog_clock.png
new file mode 100644
index 0000000..99764c6
--- /dev/null
+++ b/res/drawable-hdpi/ic_widget_analog_clock.png
Binary files differ
diff --git a/res/drawable-hdpi/stat_notify_alarm.png b/res/drawable-hdpi/stat_notify_alarm.png
new file mode 100644
index 0000000..64f583f
--- /dev/null
+++ b/res/drawable-hdpi/stat_notify_alarm.png
Binary files differ
diff --git a/res/drawable/appwidget_clock_dial.png b/res/drawable-mdpi/appwidget_clock_dial.png
similarity index 100%
rename from res/drawable/appwidget_clock_dial.png
rename to res/drawable-mdpi/appwidget_clock_dial.png
Binary files differ
diff --git a/res/drawable/appwidget_clock_hour.png b/res/drawable-mdpi/appwidget_clock_hour.png
similarity index 100%
rename from res/drawable/appwidget_clock_hour.png
rename to res/drawable-mdpi/appwidget_clock_hour.png
Binary files differ
diff --git a/res/drawable/appwidget_clock_minute.png b/res/drawable-mdpi/appwidget_clock_minute.png
similarity index 100%
rename from res/drawable/appwidget_clock_minute.png
rename to res/drawable-mdpi/appwidget_clock_minute.png
Binary files differ
diff --git a/res/drawable/circle0.png b/res/drawable-mdpi/circle0.png
similarity index 100%
rename from res/drawable/circle0.png
rename to res/drawable-mdpi/circle0.png
Binary files differ
diff --git a/res/drawable/circle1.png b/res/drawable-mdpi/circle1.png
similarity index 100%
rename from res/drawable/circle1.png
rename to res/drawable-mdpi/circle1.png
Binary files differ
diff --git a/res/drawable/circle2.png b/res/drawable-mdpi/circle2.png
similarity index 100%
rename from res/drawable/circle2.png
rename to res/drawable-mdpi/circle2.png
Binary files differ
diff --git a/res/drawable/circle3.png b/res/drawable-mdpi/circle3.png
similarity index 100%
rename from res/drawable/circle3.png
rename to res/drawable-mdpi/circle3.png
Binary files differ
diff --git a/res/drawable/clock_dial.png b/res/drawable-mdpi/clock_dial.png
similarity index 100%
rename from res/drawable/clock_dial.png
rename to res/drawable-mdpi/clock_dial.png
Binary files differ
diff --git a/res/drawable/clock_hour.png b/res/drawable-mdpi/clock_hour.png
similarity index 100%
rename from res/drawable/clock_hour.png
rename to res/drawable-mdpi/clock_hour.png
Binary files differ
diff --git a/res/drawable/clock_minute.png b/res/drawable-mdpi/clock_minute.png
similarity index 100%
rename from res/drawable/clock_minute.png
rename to res/drawable-mdpi/clock_minute.png
Binary files differ
diff --git a/res/drawable/clockdroid2_dial.png b/res/drawable-mdpi/clockdroid2_dial.png
similarity index 100%
rename from res/drawable/clockdroid2_dial.png
rename to res/drawable-mdpi/clockdroid2_dial.png
Binary files differ
diff --git a/res/drawable/clockdroid2_hour.png b/res/drawable-mdpi/clockdroid2_hour.png
similarity index 100%
rename from res/drawable/clockdroid2_hour.png
rename to res/drawable-mdpi/clockdroid2_hour.png
Binary files differ
diff --git a/res/drawable/clockdroid2_minute.png b/res/drawable-mdpi/clockdroid2_minute.png
similarity index 100%
rename from res/drawable/clockdroid2_minute.png
rename to res/drawable-mdpi/clockdroid2_minute.png
Binary files differ
diff --git a/res/drawable/clockdroids_dial.png b/res/drawable-mdpi/clockdroids_dial.png
similarity index 100%
rename from res/drawable/clockdroids_dial.png
rename to res/drawable-mdpi/clockdroids_dial.png
Binary files differ
diff --git a/res/drawable/clockdroids_hour.png b/res/drawable-mdpi/clockdroids_hour.png
similarity index 100%
rename from res/drawable/clockdroids_hour.png
rename to res/drawable-mdpi/clockdroids_hour.png
Binary files differ
diff --git a/res/drawable/clockdroids_minute.png b/res/drawable-mdpi/clockdroids_minute.png
similarity index 100%
rename from res/drawable/clockdroids_minute.png
rename to res/drawable-mdpi/clockdroids_minute.png
Binary files differ
diff --git a/res/drawable/clockgoog_dial.png b/res/drawable-mdpi/clockgoog_dial.png
similarity index 100%
rename from res/drawable/clockgoog_dial.png
rename to res/drawable-mdpi/clockgoog_dial.png
Binary files differ
diff --git a/res/drawable/clockgoog_hour.png b/res/drawable-mdpi/clockgoog_hour.png
similarity index 100%
rename from res/drawable/clockgoog_hour.png
rename to res/drawable-mdpi/clockgoog_hour.png
Binary files differ
diff --git a/res/drawable/clockgoog_minute.png b/res/drawable-mdpi/clockgoog_minute.png
similarity index 100%
rename from res/drawable/clockgoog_minute.png
rename to res/drawable-mdpi/clockgoog_minute.png
Binary files differ
diff --git a/res/drawable/dialog.9.png b/res/drawable-mdpi/dialog.9.png
similarity index 100%
rename from res/drawable/dialog.9.png
rename to res/drawable-mdpi/dialog.9.png
Binary files differ
diff --git a/res/drawable/ic_launcher_alarmclock.png b/res/drawable-mdpi/ic_launcher_alarmclock.png
old mode 100755
new mode 100644
similarity index 100%
rename from res/drawable/ic_launcher_alarmclock.png
rename to res/drawable-mdpi/ic_launcher_alarmclock.png
Binary files differ
diff --git a/res/drawable/ic_menu_clock_face.png b/res/drawable-mdpi/ic_menu_clock_face.png
similarity index 100%
rename from res/drawable/ic_menu_clock_face.png
rename to res/drawable-mdpi/ic_menu_clock_face.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_widget_analog_clock.png b/res/drawable-mdpi/ic_widget_analog_clock.png
new file mode 100755
index 0000000..f0275eb
--- /dev/null
+++ b/res/drawable-mdpi/ic_widget_analog_clock.png
Binary files differ
diff --git a/res/drawable-mdpi/stat_notify_alarm.png b/res/drawable-mdpi/stat_notify_alarm.png
new file mode 100644
index 0000000..6012575
--- /dev/null
+++ b/res/drawable-mdpi/stat_notify_alarm.png
Binary files differ
diff --git a/res/drawable/animate_circle.xml b/res/drawable/animate_circle.xml
index 02dfd51..a07b8cf 100644
--- a/res/drawable/animate_circle.xml
+++ b/res/drawable/animate_circle.xml
@@ -17,10 +17,10 @@
 <!--  Chewie... the hyperdrive ain't working -->
 <animation-list xmlns:android="http://schemas.android.com/apk/res/android"
     android:oneshot="false" android:visible="true">
-    <item android:drawable="@drawable/circle0" android:duration="80" />
-    <item android:drawable="@drawable/circle1" android:duration="80" />
-    <item android:drawable="@drawable/circle2" android:duration="80" />
-    <item android:drawable="@drawable/circle3" android:duration="80" />
+    <item android:drawable="@drawable/circle0_drawable" android:duration="80" />
+    <item android:drawable="@drawable/circle1_drawable" android:duration="80" />
+    <item android:drawable="@drawable/circle2_drawable" android:duration="80" />
+    <item android:drawable="@drawable/circle3_drawable" android:duration="80" />
 </animation-list>
 
 
diff --git a/res/drawable/circle0_drawable.xml b/res/drawable/circle0_drawable.xml
new file mode 100644
index 0000000..0137d4a
--- /dev/null
+++ b/res/drawable/circle0_drawable.xml
@@ -0,0 +1,18 @@
+<?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.
+-->
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+    android:oneshot="false" android:src="@drawable/circle0"
+    android:gravity="center"/>
diff --git a/res/drawable/circle1_drawable.xml b/res/drawable/circle1_drawable.xml
new file mode 100644
index 0000000..1272c4b
--- /dev/null
+++ b/res/drawable/circle1_drawable.xml
@@ -0,0 +1,18 @@
+<?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.
+-->
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+    android:oneshot="false" android:src="@drawable/circle1"
+    android:gravity="center"/>
diff --git a/res/drawable/circle2_drawable.xml b/res/drawable/circle2_drawable.xml
new file mode 100644
index 0000000..d1b492d
--- /dev/null
+++ b/res/drawable/circle2_drawable.xml
@@ -0,0 +1,18 @@
+<?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.
+-->
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+    android:oneshot="false" android:src="@drawable/circle2"
+    android:gravity="center"/>
diff --git a/res/drawable/circle3_drawable.xml b/res/drawable/circle3_drawable.xml
new file mode 100644
index 0000000..1060a32
--- /dev/null
+++ b/res/drawable/circle3_drawable.xml
@@ -0,0 +1,18 @@
+<?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.
+-->
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+    android:oneshot="false" android:src="@drawable/circle3"
+    android:gravity="center"/>
diff --git a/res/layout/alarm_alert.xml b/res/layout/alarm_alert.xml
index 5db840e..1b5c2c4 100644
--- a/res/layout/alarm_alert.xml
+++ b/res/layout/alarm_alert.xml
@@ -16,8 +16,9 @@
 
 <LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="fill_parent" 
-    android:layout_height="fill_parent">
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent"
+    android:gravity="center">
 
     <LinearLayout
         android:layout_width="wrap_content"
@@ -45,9 +46,10 @@
 
         <LinearLayout
             android:id="@+id/clockView"
-            android:layout_width="210dip"
-            android:layout_height="210dip"
-            android:gravity="center"/>
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:layout_gravity="fill_vertical|center"/>
 
         <LinearLayout
             android:layout_width="wrap_content"
@@ -77,15 +79,6 @@
 
         </LinearLayout>
 
-        <TextView android:id="@+id/silencedText"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:paddingTop="2dp"
-            android:paddingBottom="2dp"
-            android:textAppearance="?android:attr/textAppearanceSmall"
-            android:visibility="gone"
-            android:gravity="center"
-            android:textColor="@color/red"/>
-
     </LinearLayout>
+
 </LinearLayout>
diff --git a/res/layout/alarm_time.xml b/res/layout/alarm_time.xml
index c454d8a..ecf5cda 100644
--- a/res/layout/alarm_time.xml
+++ b/res/layout/alarm_time.xml
@@ -16,6 +16,7 @@
 
 <LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
+    android:paddingLeft="5dip"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content">
 
@@ -25,13 +26,11 @@
     <com.android.alarmclock.DigitalClock android:id="@+id/digitalClock"
         android:layout_width="wrap_content"
         android:layout_height="fill_parent"
-        android:focusable="true"
         android:layout_weight="1"
         android:gravity="center_vertical"
         android:orientation="vertical"
-        android:paddingLeft="8dp"
-        android:paddingRight="8dp"
-        android:background="@android:drawable/menuitem_background">
+        android:paddingLeft="8dip"
+        android:paddingRight="8dip">
 
         <LinearLayout
             android:layout_width="fill_parent"
@@ -40,55 +39,54 @@
             <TextView android:id="@+id/timeDisplay"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:paddingTop="-4dp"
-                android:paddingBottom="-4dp"
-                android:textSize="28sp"
+                android:textSize="30sp"
                 android:textColor="@color/white"/>
 
             <LinearLayout android:id="@+id/am_pm"
                 android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_marginLeft="4dp"
+                android:layout_height="fill_parent"
+                android:layout_marginLeft="4dip"
                 android:orientation="vertical">
 
                 <TextView android:id="@+id/am"
                     android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:layout_marginTop="3dp"
+                    android:layout_height="fill_parent"
+                    android:gravity="bottom"
+                    android:layout_weight=".5"
+                    android:includeFontPadding="false"
                     android:textSize="12sp"/>
+
                 <TextView android:id="@+id/pm"
                     android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:layout_marginTop="-4dp"
+                    android:layout_height="fill_parent"
+                    android:gravity="top"
+                    android:layout_weight=".5"
+                    android:includeFontPadding="false"
                     android:textSize="12sp"/>
+
             </LinearLayout>
-
-            <TextView android:id="@+id/label"
-                android:layout_width="fill_parent"
-                android:layout_height="wrap_content"
-                android:text="@string/default_label"
-                android:paddingTop="-4dp"
-                android:paddingBottom="-4dp"
-                android:textSize="28sp"
-                android:textColor="@color/white"
-                android:layout_marginLeft="20dp"
-                android:singleLine="true"/>
-
         </LinearLayout>
 
         <TextView android:id="@+id/daysOfWeek"
             android:layout_width="fill_parent"
             android:layout_height="wrap_content"
             android:textSize="10sp"
+            android:textColor="@color/ltgrey"/>
+
+        <TextView android:id="@+id/label"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:textSize="12sp"
             android:textColor="@color/ltgrey"
-            android:layout_marginLeft="2dp"
-            android:visibility="gone"/>
+            android:textStyle="bold|italic"
+            android:singleLine="true"/>
 
     </com.android.alarmclock.DigitalClock>
 
     <CheckBox android:id="@+id/alarmButton"
-        android:layout_width="60dp"
-        android:layout_height="60dp"
+        android:focusable="false"
+        android:layout_width="60dip"
+        android:layout_height="76dip"
         android:layout_gravity="center_vertical"/>
 
 </LinearLayout>
diff --git a/res/layout/context_menu_header.xml b/res/layout/context_menu_header.xml
new file mode 100644
index 0000000..6ac4dc5
--- /dev/null
+++ b/res/layout/context_menu_header.xml
@@ -0,0 +1,52 @@
+<?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.
+-->
+
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="fill_parent"
+    android:layout_height="wrap_content"
+    android:paddingTop="6dip"
+    android:paddingBottom="9dip"
+    android:paddingLeft="10dip"
+    android:paddingRight="10dip">
+
+    <ImageView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="top"
+        android:paddingTop="6dip"
+        android:paddingRight="10dip"
+        android:src="@*android:drawable/ic_dialog_time"/>
+
+    <TextView android:id="@+id/header_time"
+        style="?android:attr/textAppearanceLarge"
+        android:layout_width="wrap_content"
+        android:layout_height="fill_parent"
+        android:singleLine="true"
+        android:gravity="center_vertical"
+        android:ellipsize="none"/>
+
+    <TextView android:id="@+id/header_label"
+        style="?android:attr/textAppearanceLarge"
+        android:layout_width="fill_parent"
+        android:layout_height="fill_parent"
+        android:layout_marginLeft="20dip"
+        android:singleLine="true"
+        android:gravity="right|center_vertical"
+        android:ellipsize="end"/>
+
+</LinearLayout>
+
diff --git a/res/layout/digital_clock.xml b/res/layout/digital_clock.xml
index fbc37f0..bca806f 100644
--- a/res/layout/digital_clock.xml
+++ b/res/layout/digital_clock.xml
@@ -30,18 +30,23 @@
 
     <LinearLayout android:id="@+id/am_pm"
         android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
+        android:layout_height="fill_parent"
+        android:layout_marginLeft="4dip"
         android:orientation="vertical">
 
         <TextView android:id="@+id/am"
             android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginTop="-7dp"
+            android:layout_height="fill_parent"
+            android:gravity="bottom"
+            android:layout_weight=".5"
+            android:includeFontPadding="false"
             android:textSize="28sp"/>
         <TextView android:id="@+id/pm"
             android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginTop="-4dp"
+            android:layout_height="fill_parent"
+            android:gravity="top"
+            android:layout_weight=".5"
+            android:includeFontPadding="false"
             android:textSize="28sp"/>
     </LinearLayout>
 </com.android.alarmclock.DigitalClock>
diff --git a/res/layout/save_cancel_alarm.xml b/res/layout/save_cancel_alarm.xml
new file mode 100644
index 0000000..73e9f84
--- /dev/null
+++ b/res/layout/save_cancel_alarm.xml
@@ -0,0 +1,37 @@
+<?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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="fill_parent"
+    android:layout_height="wrap_content"
+    android:orientation="horizontal"
+    style="@android:style/ButtonBar">
+
+    <Button android:id="@+id/alarm_save"
+        android:focusable="true"
+        android:layout_width="fill_parent"
+        android:layout_height="fill_parent"
+        android:layout_weight="1"
+        android:text="@string/done"/>
+
+    <Button android:id="@+id/alarm_cancel"
+        android:focusable="true"
+        android:layout_width="fill_parent"
+        android:layout_height="fill_parent"
+        android:layout_weight="1"
+        android:text="@string/revert"/>
+
+</LinearLayout>
diff --git a/res/menu/context_menu.xml b/res/menu/context_menu.xml
new file mode 100644
index 0000000..25a62be
--- /dev/null
+++ b/res/menu/context_menu.xml
@@ -0,0 +1,24 @@
+<?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.
+-->
+
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:id="@+id/enable_alarm"
+        android:title="@string/enable_alarm"/>
+    <item android:id="@+id/delete_alarm"
+        android:title="@string/delete_alarm"/>
+</menu>
+
+
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index fb05616..2e50d17 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -18,23 +18,22 @@
     <string name="app_label" msgid="6642875149600019623">"Budík"</string>
     <string name="add_alarm" msgid="5976616107390962899">"Přidat budík"</string>
     <string name="delete_alarm" msgid="3457780990646206817">"Smazat budík"</string>
+    <string name="enable_alarm" msgid="7442658245797418741">"Aktivovat budík"</string>
+    <string name="disable_alarm" msgid="6665528499886549648">"Deaktivovat budík"</string>
     <string name="delete_alarm_confirm" msgid="4237696873219106907">"Tento budík bude smazán."</string>
     <string name="show_clock" msgid="8358759982675616915">"Zobrazit hodiny"</string>
     <string name="hide_clock" msgid="3217727306480505694">"Skrýt hodiny"</string>
     <string name="label" msgid="162189613902857319">"Štítek"</string>
     <string name="default_label" msgid="5590025289805630372">"Budík"</string>
     <string name="set_alarm" msgid="9148359866152726808">"Nastavit budík"</string>
-    <string name="enable" msgid="3089255608289797715">"Zapnout budík"</string>
     <string name="alarm_vibrate" msgid="3476686921490362230">"Vibrace"</string>
     <string name="alarm_repeat" msgid="7242985466344233206">"Opakovat"</string>
     <string name="alert" msgid="6539852766423700221">"Vyzváněcí tón"</string>
     <string name="time" msgid="8067216534232296518">"Čas"</string>
-    <string name="alert_title" msgid="1600112166027371802">"Budík"</string>
     <string name="alarm_alert_dismiss_text" msgid="4942914605480888820">"Zavřít"</string>
     <string name="alarm_alert_alert_silenced" msgid="7918075929961104202">"Budík byl ztišen po uplynutí <xliff:g id="MINUTES">%d</xliff:g> min."</string>
     <string name="alarm_alert_snooze_text" msgid="1774416052207651584">"Odložit"</string>
     <string name="alarm_alert_snooze_set" msgid="656470966696912087">"Upozornění odloženo o <xliff:g id="MINUTES">%d</xliff:g> min."</string>
-    <string name="alarm_alert_snooze_not_set" msgid="8783980489802220546">"Budík nebyl odložen – další budík v <xliff:g id="TIME">%s</xliff:g>."</string>
   <string-array name="alarm_set">
     <item msgid="5163476010406761625">"Tento budík se spustí za méně než 1 minutu."</item>
     <item msgid="7110525731259629055">"Tento budík se spustí za <xliff:g id="DAYS">%1$s</xliff:g> dny."</item>
@@ -55,10 +54,45 @@
     <string name="never" msgid="54104287800571769">"Nikdy"</string>
     <string name="day_concat" msgid="971998564991636532">", "</string>
     <string name="clock_instructions" msgid="3118560284915857690">"Vyberte hodiny, které mají být zobrazeny."</string>
-    <string name="error" msgid="108628064084462722">"Budík není nastaven"</string>
-    <string name="dberror" msgid="6922426026866330853">"Budík bohužel nelze nastavit."</string>
     <string name="analog_gadget" msgid="1670505720837152766">"Analogové hodiny"</string>
     <string name="settings" msgid="5849739030579520686">"Nastavení"</string>
     <string name="alarm_in_silent_mode_title" msgid="3892612644543516705">"Budík v tichém režimu"</string>
     <string name="alarm_in_silent_mode_summary" msgid="6042500263899922832">"Aktivovat budík i v případě, že je telefon v tichém režimu."</string>
+    <string name="snooze_duration_title" msgid="1471249885139952670">"Doba odložení"</string>
+  <string-array name="snooze_duration_entries">
+    <item msgid="8337408933053603125">"5 min"</item>
+    <item msgid="5294206441496024610">"10 min"</item>
+    <item msgid="2165904039211935470">"15 min"</item>
+    <item msgid="7248236967714374250">"20 min"</item>
+    <item msgid="738394723625179423">"25 min"</item>
+    <item msgid="1180222611308391616">"30 min"</item>
+  </string-array>
+  <string-array name="snooze_duration_values">
+    <item msgid="3655014754453084122">"5"</item>
+    <item msgid="8939029597449573449">"10"</item>
+    <item msgid="3922647341176353315">"15"</item>
+    <item msgid="5821804105985044459">"20"</item>
+    <item msgid="6048861883552402852">"25"</item>
+    <item msgid="2740866721232379791">"30"</item>
+  </string-array>
+    <string name="done" msgid="6509722361933858451">"Hotovo"</string>
+    <string name="revert" msgid="9100911171235162926">"Vrátit zpět"</string>
+    <string name="alarm_volume_title" msgid="8506245173912428522">"Hlasitost budíku"</string>
+    <string name="alarm_volume_summary" msgid="8957440373896242438">"Nastavit hlasitost budíků"</string>
+    <string name="silent_alarm_summary" msgid="8605302849408279221">"Tichý"</string>
+    <string name="alarm_notify_text" msgid="4146350965933990093">"Vyberte, zda budík chcete ukončit nebo odložit."</string>
+    <string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (odloženo)"</string>
+    <string name="alarm_notify_snooze_text" msgid="8004830999152609519">"Budík byl nastaven na <xliff:g id="TIME">%s</xliff:g>. Můžete jej případně vybrat a zrušit."</string>
+    <string name="volume_button_setting_title" msgid="1892885285888644234">"Chování postranního tlačítka"</string>
+    <string name="volume_button_setting_summary" msgid="1594641247799573198">"Umožňuje nastavit chování postranních tlačítek při vyzvánění budíku"</string>
+  <string-array name="volume_button_setting_entries">
+    <item msgid="4520420953175098625">"Žádné"</item>
+    <item msgid="7111908302622811168">"Odložit"</item>
+    <item msgid="8573552194573068996">"Ukončit"</item>
+  </string-array>
+  <string-array name="volume_button_setting_values">
+    <item msgid="4851033050639608752">"0"</item>
+    <item msgid="3204893476515513084">"1"</item>
+    <item msgid="7687709558968154577">"2"</item>
+  </string-array>
 </resources>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 478e42f..e76c3e2 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -18,31 +18,32 @@
     <string name="app_label" msgid="6642875149600019623">"Alarm"</string>
     <string name="add_alarm" msgid="5976616107390962899">"Tilføj alarm"</string>
     <string name="delete_alarm" msgid="3457780990646206817">"Slet alarm"</string>
+    <string name="enable_alarm" msgid="7442658245797418741">"Aktiver alarm"</string>
+    <string name="disable_alarm" msgid="6665528499886549648">"Deaktiver alarm"</string>
     <string name="delete_alarm_confirm" msgid="4237696873219106907">"Denne alarm slettes."</string>
     <string name="show_clock" msgid="8358759982675616915">"Vis ur"</string>
     <string name="hide_clock" msgid="3217727306480505694">"Skjul ur"</string>
     <string name="label" msgid="162189613902857319">"Etiket"</string>
     <string name="default_label" msgid="5590025289805630372">"Alarm"</string>
     <string name="set_alarm" msgid="9148359866152726808">"Indstil alarm"</string>
-    <string name="enable" msgid="3089255608289797715">"Slå alarm til"</string>
     <string name="alarm_vibrate" msgid="3476686921490362230">"Vibrer"</string>
     <string name="alarm_repeat" msgid="7242985466344233206">"Gentag"</string>
     <string name="alert" msgid="6539852766423700221">"Ringetone"</string>
     <string name="time" msgid="8067216534232296518">"Tid"</string>
-    <string name="alert_title" msgid="1600112166027371802">"Alarm"</string>
     <string name="alarm_alert_dismiss_text" msgid="4942914605480888820">"Annuller"</string>
     <string name="alarm_alert_alert_silenced" msgid="7918075929961104202">"Alarm dæmpes efter <xliff:g id="MINUTES">%d</xliff:g> minutter"</string>
     <string name="alarm_alert_snooze_text" msgid="1774416052207651584">"Slumretilstand"</string>
     <string name="alarm_alert_snooze_set" msgid="656470966696912087">"Slumrer i <xliff:g id="MINUTES">%d</xliff:g> minutter."</string>
-    <string name="alarm_alert_snooze_not_set" msgid="8783980489802220546">"Der er ikke indstillet slumretilstand. Næste alarm er indstillet til <xliff:g id="TIME">%s</xliff:g>"</string>
-    <!-- no translation found for alarm_set:0 (5163476010406761625) -->
-    <!-- no translation found for alarm_set:1 (7110525731259629055) -->
-    <!-- no translation found for alarm_set:2 (7003982794086186185) -->
-    <!-- no translation found for alarm_set:3 (7311021123230077742) -->
-    <!-- no translation found for alarm_set:4 (8431715191823114872) -->
-    <!-- no translation found for alarm_set:5 (3244151088673185428) -->
-    <!-- no translation found for alarm_set:6 (3663661342600168814) -->
-    <!-- no translation found for alarm_set:7 (7779544127785487304) -->
+  <string-array name="alarm_set">
+    <item msgid="5163476010406761625">"Alarm er indstillet til mindre end 1 minut fra nu af."</item>
+    <item msgid="7110525731259629055">"Alarmen er indstillet til <xliff:g id="DAYS">%1$s</xliff:g> fra nu af."</item>
+    <item msgid="7003982794086186185">"Alarmen er indstillet til <xliff:g id="HOURS">%2$s</xliff:g> fra nu af."</item>
+    <item msgid="7311021123230077742">"Alarmen er indstillet til <xliff:g id="DAYS">%1$s</xliff:g> og <xliff:g id="HOURS">%2$s</xliff:g> fra nu af."</item>
+    <item msgid="8431715191823114872">"Alarmen er indstillet til <xliff:g id="MINUTES">%3$s</xliff:g> fra nu af."</item>
+    <item msgid="3244151088673185428">"Alarmen er indstillet til <xliff:g id="DAYS">%1$s</xliff:g> og <xliff:g id="MINUTES">%3$s</xliff:g> fra nu af."</item>
+    <item msgid="3663661342600168814">"Alarmen er indstillet til <xliff:g id="HOURS">%2$s</xliff:g> og <xliff:g id="MINUTES">%3$s</xliff:g> fra nu af."</item>
+    <item msgid="7779544127785487304">"Alarmen er indstillet til <xliff:g id="DAYS">%1$s</xliff:g>, <xliff:g id="HOURS">%2$s</xliff:g> og <xliff:g id="MINUTES">%3$s</xliff:g> fra nu af."</item>
+  </string-array>
     <string name="day" msgid="7984755014526510295">"1 dag"</string>
     <string name="days" msgid="2070509222727852210">"<xliff:g id="DAYS">%s</xliff:g> dage"</string>
     <string name="hour" msgid="2546819039651509323">"1 time"</string>
@@ -53,10 +54,45 @@
     <string name="never" msgid="54104287800571769">"Aldrig"</string>
     <string name="day_concat" msgid="971998564991636532">", "</string>
     <string name="clock_instructions" msgid="3118560284915857690">"Vælg et ur, der skal vises."</string>
-    <string name="error" msgid="108628064084462722">"Alarmen er ikke indstillet"</string>
-    <string name="dberror" msgid="6922426026866330853">"Beklager, alarmen kunne ikke indstilles."</string>
     <string name="analog_gadget" msgid="1670505720837152766">"Analogt ur"</string>
     <string name="settings" msgid="5849739030579520686">"Indstillinger"</string>
     <string name="alarm_in_silent_mode_title" msgid="3892612644543516705">"Alarm er i lydløs tilstand"</string>
     <string name="alarm_in_silent_mode_summary" msgid="6042500263899922832">"Afspil alarm, selvom telefonen er i lydløs tilstand"</string>
+    <string name="snooze_duration_title" msgid="1471249885139952670">"Slumretilstands varighed"</string>
+  <string-array name="snooze_duration_entries">
+    <item msgid="8337408933053603125">"5 minutter"</item>
+    <item msgid="5294206441496024610">"10 minutter"</item>
+    <item msgid="2165904039211935470">"15 minutter"</item>
+    <item msgid="7248236967714374250">"20 minutter"</item>
+    <item msgid="738394723625179423">"25 minutter"</item>
+    <item msgid="1180222611308391616">"30 minutter"</item>
+  </string-array>
+  <string-array name="snooze_duration_values">
+    <item msgid="3655014754453084122">"5"</item>
+    <item msgid="8939029597449573449">"10"</item>
+    <item msgid="3922647341176353315">"15"</item>
+    <item msgid="5821804105985044459">"20"</item>
+    <item msgid="6048861883552402852">"25"</item>
+    <item msgid="2740866721232379791">"30"</item>
+  </string-array>
+    <string name="done" msgid="6509722361933858451">"Færdig"</string>
+    <string name="revert" msgid="9100911171235162926">"Vend tilbage"</string>
+    <string name="alarm_volume_title" msgid="8506245173912428522">"Alarmlydstyrke"</string>
+    <string name="alarm_volume_summary" msgid="8957440373896242438">"Indstil alarmernes lydstyrke"</string>
+    <string name="silent_alarm_summary" msgid="8605302849408279221">"Lydløs"</string>
+    <string name="alarm_notify_text" msgid="4146350965933990093">"Vælg for at slumre eller annullere alarmen."</string>
+    <string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (slumretilstand)"</string>
+    <string name="alarm_notify_snooze_text" msgid="8004830999152609519">"Alarmen er indstillet til <xliff:g id="TIME">%s</xliff:g>. Vælg for at annullere."</string>
+    <string name="volume_button_setting_title" msgid="1892885285888644234">"Sideknaps adfærd"</string>
+    <string name="volume_button_setting_summary" msgid="1594641247799573198">"Indstil ønsket adfærd for sideknappen, når der trykkes på den under en alarm"</string>
+  <string-array name="volume_button_setting_entries">
+    <item msgid="4520420953175098625">"Ingen"</item>
+    <item msgid="7111908302622811168">"Slumretilstand"</item>
+    <item msgid="8573552194573068996">"Annuller"</item>
+  </string-array>
+  <string-array name="volume_button_setting_values">
+    <item msgid="4851033050639608752">"0"</item>
+    <item msgid="3204893476515513084">"1"</item>
+    <item msgid="7687709558968154577">"2"</item>
+  </string-array>
 </resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index f176b4c..b9c53a4 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -18,23 +18,22 @@
     <string name="app_label" msgid="6642875149600019623">"Wecker"</string>
     <string name="add_alarm" msgid="5976616107390962899">"Wecker hinzufügen"</string>
     <string name="delete_alarm" msgid="3457780990646206817">"Wecker löschen"</string>
+    <string name="enable_alarm" msgid="7442658245797418741">"Wecker aktivieren"</string>
+    <string name="disable_alarm" msgid="6665528499886549648">"Wecker deaktivieren"</string>
     <string name="delete_alarm_confirm" msgid="4237696873219106907">"Dieser Alarm wird gelöscht."</string>
     <string name="show_clock" msgid="8358759982675616915">"Uhr anzeigen"</string>
     <string name="hide_clock" msgid="3217727306480505694">"Uhr ausblenden"</string>
     <string name="label" msgid="162189613902857319">"Label"</string>
     <string name="default_label" msgid="5590025289805630372">"Wecker"</string>
     <string name="set_alarm" msgid="9148359866152726808">"Wecker einstellen"</string>
-    <string name="enable" msgid="3089255608289797715">"Wecker aktivieren"</string>
     <string name="alarm_vibrate" msgid="3476686921490362230">"Vibrieren"</string>
     <string name="alarm_repeat" msgid="7242985466344233206">"Wiederholen"</string>
     <string name="alert" msgid="6539852766423700221">"Klingelton"</string>
     <string name="time" msgid="8067216534232296518">"Uhrzeit"</string>
-    <string name="alert_title" msgid="1600112166027371802">"Wecker"</string>
     <string name="alarm_alert_dismiss_text" msgid="4942914605480888820">"Verwerfen"</string>
     <string name="alarm_alert_alert_silenced" msgid="7918075929961104202">"Der Wecker verstummte nach <xliff:g id="MINUTES">%d</xliff:g> Minuten"</string>
     <string name="alarm_alert_snooze_text" msgid="1774416052207651584">"Snooze-Funktion"</string>
     <string name="alarm_alert_snooze_set" msgid="656470966696912087">"Snooze-Funktion aktiviert für <xliff:g id="MINUTES">%d</xliff:g> Minuten"</string>
-    <string name="alarm_alert_snooze_not_set" msgid="8783980489802220546">"Snooze-Funktion nicht aktiviert - nächster Wecker klingelt <xliff:g id="TIME">%s</xliff:g>."</string>
   <string-array name="alarm_set">
     <item msgid="5163476010406761625">"Dieser Wecker klingelt in weniger als 1 Minute."</item>
     <item msgid="7110525731259629055">"Dieser Wecker klingelt in <xliff:g id="DAYS">%1$s</xliff:g>."</item>
@@ -55,10 +54,45 @@
     <string name="never" msgid="54104287800571769">"Nie"</string>
     <string name="day_concat" msgid="971998564991636532">", "</string>
     <string name="clock_instructions" msgid="3118560284915857690">"Wählen Sie die anzuzeigende Uhr aus."</string>
-    <string name="error" msgid="108628064084462722">"Wecker nicht eingestellt"</string>
-    <string name="dberror" msgid="6922426026866330853">"Der Wecker konnte nicht eingestellt werden."</string>
     <string name="analog_gadget" msgid="1670505720837152766">"Analoguhr"</string>
     <string name="settings" msgid="5849739030579520686">"Einstellungen"</string>
     <string name="alarm_in_silent_mode_title" msgid="3892612644543516705">"Alarm im Lautlosmodus"</string>
     <string name="alarm_in_silent_mode_summary" msgid="6042500263899922832">"Alarm auch im Lautlosmodus auslösen"</string>
+    <string name="snooze_duration_title" msgid="1471249885139952670">"Snooze-Dauer"</string>
+  <string-array name="snooze_duration_entries">
+    <item msgid="8337408933053603125">"5 Minuten"</item>
+    <item msgid="5294206441496024610">"10 Minuten"</item>
+    <item msgid="2165904039211935470">"15 Minuten"</item>
+    <item msgid="7248236967714374250">"20 Minuten"</item>
+    <item msgid="738394723625179423">"25 Minuten"</item>
+    <item msgid="1180222611308391616">"30 Minuten"</item>
+  </string-array>
+  <string-array name="snooze_duration_values">
+    <item msgid="3655014754453084122">"5"</item>
+    <item msgid="8939029597449573449">"10"</item>
+    <item msgid="3922647341176353315">"15"</item>
+    <item msgid="5821804105985044459">"20"</item>
+    <item msgid="6048861883552402852">"25"</item>
+    <item msgid="2740866721232379791">"30"</item>
+  </string-array>
+    <string name="done" msgid="6509722361933858451">"Fertig"</string>
+    <string name="revert" msgid="9100911171235162926">"Zurücksetzen"</string>
+    <string name="alarm_volume_title" msgid="8506245173912428522">"Lautstärke für Alarm"</string>
+    <string name="alarm_volume_summary" msgid="8957440373896242438">"Lautstärke des Weckers einstellen"</string>
+    <string name="silent_alarm_summary" msgid="8605302849408279221">"Lautlos"</string>
+    <string name="alarm_notify_text" msgid="4146350965933990093">"Für Snooze-Funktion oder Ablehnen der Weckerfunktion auswählen"</string>
+    <string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (Snooze)"</string>
+    <string name="alarm_notify_snooze_text" msgid="8004830999152609519">"Wecker für <xliff:g id="TIME">%s</xliff:g> gestellt. Zum Abbrechen auswählen."</string>
+    <string name="volume_button_setting_title" msgid="1892885285888644234">"Verhalten der seitlichen Schaltfläche"</string>
+    <string name="volume_button_setting_summary" msgid="1594641247799573198">"Stellen Sie das gewünschte Verhalten der seitlichen Schaltflächen ein, wenn Sie während des Weckerklingelns gedrückt werden."</string>
+  <string-array name="volume_button_setting_entries">
+    <item msgid="4520420953175098625">"Keine"</item>
+    <item msgid="7111908302622811168">"Snooze-Funktion"</item>
+    <item msgid="8573552194573068996">"Verwerfen"</item>
+  </string-array>
+  <string-array name="volume_button_setting_values">
+    <item msgid="4851033050639608752">"0"</item>
+    <item msgid="3204893476515513084">"1"</item>
+    <item msgid="7687709558968154577">"2"</item>
+  </string-array>
 </resources>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 6357ded..0fdc0a1 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -18,31 +18,32 @@
     <string name="app_label" msgid="6642875149600019623">"Ξυπνητήρι"</string>
     <string name="add_alarm" msgid="5976616107390962899">"Προσθήκη ξυπνητηριού"</string>
     <string name="delete_alarm" msgid="3457780990646206817">"Διαγραφή ξυπνητηριού"</string>
+    <string name="enable_alarm" msgid="7442658245797418741">"Ενεργοποίηση ξυπνητηριού"</string>
+    <string name="disable_alarm" msgid="6665528499886549648">"Απενεργοποίηση ξυπνητηριού"</string>
     <string name="delete_alarm_confirm" msgid="4237696873219106907">"Αυτό το ξυπνητήρι θα διαγραφεί."</string>
     <string name="show_clock" msgid="8358759982675616915">"Εμφάνιση ρολογιού"</string>
     <string name="hide_clock" msgid="3217727306480505694">"Απόκρυψη ρολογιού"</string>
     <string name="label" msgid="162189613902857319">"Ετικέτα"</string>
     <string name="default_label" msgid="5590025289805630372">"Ξυπνητήρι"</string>
     <string name="set_alarm" msgid="9148359866152726808">"Ορισμός ξυπνητηριού"</string>
-    <string name="enable" msgid="3089255608289797715">"Ενεργοποίηση ξυπνητηριού"</string>
     <string name="alarm_vibrate" msgid="3476686921490362230">"Δόνηση"</string>
     <string name="alarm_repeat" msgid="7242985466344233206">"Επανάληψη"</string>
     <string name="alert" msgid="6539852766423700221">"Ήχος ξυπνητηριού"</string>
     <string name="time" msgid="8067216534232296518">"Ώρα"</string>
-    <string name="alert_title" msgid="1600112166027371802">"Ξυπνητήρι"</string>
     <string name="alarm_alert_dismiss_text" msgid="4942914605480888820">"Παράβλεψη"</string>
     <string name="alarm_alert_alert_silenced" msgid="7918075929961104202">"Σιγή ξυπνητηριού μετά από <xliff:g id="MINUTES">%d</xliff:g> λεπτά"</string>
     <string name="alarm_alert_snooze_text" msgid="1774416052207651584">"Αναβολή αφύπνισης"</string>
     <string name="alarm_alert_snooze_set" msgid="656470966696912087">"Αναβολή αφύπνισης για <xliff:g id="MINUTES">%d</xliff:g> λεπτά."</string>
-    <string name="alarm_alert_snooze_not_set" msgid="8783980489802220546">"Δεν έχει οριστεί η αναβολή αφύπνισης -- το επόμενο ξυπνητήρι έχει οριστεί στις <xliff:g id="TIME">%s</xliff:g>"</string>
-    <!-- no translation found for alarm_set:0 (5163476010406761625) -->
-    <!-- no translation found for alarm_set:1 (7110525731259629055) -->
-    <!-- no translation found for alarm_set:2 (7003982794086186185) -->
-    <!-- no translation found for alarm_set:3 (7311021123230077742) -->
-    <!-- no translation found for alarm_set:4 (8431715191823114872) -->
-    <!-- no translation found for alarm_set:5 (3244151088673185428) -->
-    <!-- no translation found for alarm_set:6 (3663661342600168814) -->
-    <!-- no translation found for alarm_set:7 (7779544127785487304) -->
+  <string-array name="alarm_set">
+    <item msgid="5163476010406761625">"Το ξυπνητήρι αυτό έχει οριστεί σε λιγότερο από 1 λεπτό από τώρα."</item>
+    <item msgid="7110525731259629055">"Το ξυπνητήρι αυτό έχει οριστεί σε <xliff:g id="DAYS">%1$s</xliff:g> από τώρα."</item>
+    <item msgid="7003982794086186185">"Το ξυπνητήρι αυτό έχει οριστεί σε <xliff:g id="HOURS">%2$s</xliff:g> από τώρα."</item>
+    <item msgid="7311021123230077742">"Το ξυπνητήρι αυτό έχει οριστεί σε <xliff:g id="DAYS">%1$s</xliff:g> και σε <xliff:g id="HOURS">%2$s</xliff:g> από τώρα."</item>
+    <item msgid="8431715191823114872">"Το ξυπνητήρι αυτό έχει οριστεί σε <xliff:g id="MINUTES">%3$s</xliff:g> από τώρα."</item>
+    <item msgid="3244151088673185428">"Το ξυπνητήρι αυτό έχει οριστεί σε <xliff:g id="DAYS">%1$s</xliff:g> και σε <xliff:g id="MINUTES">%3$s</xliff:g> από τώρα."</item>
+    <item msgid="3663661342600168814">"Το ξυπνητήρι αυτό έχει οριστεί σε <xliff:g id="HOURS">%2$s</xliff:g> και σε <xliff:g id="MINUTES">%3$s</xliff:g> από τώρα."</item>
+    <item msgid="7779544127785487304">"Το ξυπνητήρι αυτό έχει οριστεί σε <xliff:g id="DAYS">%1$s</xliff:g>, <xliff:g id="HOURS">%2$s</xliff:g>και <xliff:g id="MINUTES">%3$s</xliff:g> από τώρα."</item>
+  </string-array>
     <string name="day" msgid="7984755014526510295">"1 ημέρα"</string>
     <string name="days" msgid="2070509222727852210">"<xliff:g id="DAYS">%s</xliff:g> ημέρες"</string>
     <string name="hour" msgid="2546819039651509323">"1 ώρα"</string>
@@ -53,10 +54,45 @@
     <string name="never" msgid="54104287800571769">"Ποτέ"</string>
     <string name="day_concat" msgid="971998564991636532">", "</string>
     <string name="clock_instructions" msgid="3118560284915857690">"Επιλογή ρολογιού για προβολή."</string>
-    <string name="error" msgid="108628064084462722">"Το ξυπνητήρι δεν έχει οριστεί"</string>
-    <string name="dberror" msgid="6922426026866330853">"Λυπούμαστε, δεν ήταν δυνατός ο ορισμός του ξυπνητηριού."</string>
     <string name="analog_gadget" msgid="1670505720837152766">"Αναλογικό ρολόι"</string>
     <string name="settings" msgid="5849739030579520686">"Ρυθμίσεις"</string>
     <string name="alarm_in_silent_mode_title" msgid="3892612644543516705">"Ξυπνητήρι σε αθόρυβη λειτουργία"</string>
     <string name="alarm_in_silent_mode_summary" msgid="6042500263899922832">"Αναπ/γή ήχου ξυπνητ.ακόμα και όταν το τηλ.βρίσκ.σε αθόρ.λειτ."</string>
+    <string name="snooze_duration_title" msgid="1471249885139952670">"Διάρκεια αφύπνισης"</string>
+  <string-array name="snooze_duration_entries">
+    <item msgid="8337408933053603125">"5 λεπτά"</item>
+    <item msgid="5294206441496024610">"10 λεπτά"</item>
+    <item msgid="2165904039211935470">"15 λεπτά"</item>
+    <item msgid="7248236967714374250">"20 λεπτά"</item>
+    <item msgid="738394723625179423">"25 λεπτά"</item>
+    <item msgid="1180222611308391616">"30 λεπτά"</item>
+  </string-array>
+  <string-array name="snooze_duration_values">
+    <item msgid="3655014754453084122">"5"</item>
+    <item msgid="8939029597449573449">"10"</item>
+    <item msgid="3922647341176353315">"15"</item>
+    <item msgid="5821804105985044459">"20"</item>
+    <item msgid="6048861883552402852">"25"</item>
+    <item msgid="2740866721232379791">"30"</item>
+  </string-array>
+    <string name="done" msgid="6509722361933858451">"Τέλος"</string>
+    <string name="revert" msgid="9100911171235162926">"Επαναφορά"</string>
+    <string name="alarm_volume_title" msgid="8506245173912428522">"Ένταση ήχου ξυπνητηριού"</string>
+    <string name="alarm_volume_summary" msgid="8957440373896242438">"Ορισμός του αριθμού των ειδοποιήσεων"</string>
+    <string name="silent_alarm_summary" msgid="8605302849408279221">"Σίγαση"</string>
+    <string name="alarm_notify_text" msgid="4146350965933990093">"Επιλέξτε την αφύπνιση ή την παράβλεψη σε αυτό το ξυπνητήρι."</string>
+    <string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (αναβολή)"</string>
+    <string name="alarm_notify_snooze_text" msgid="8004830999152609519">"Το ξυπνητήρι ρυθμίστηκε για τις <xliff:g id="TIME">%s</xliff:g>. Επιλέξτε για να ακυρώσετε."</string>
+    <string name="volume_button_setting_title" msgid="1892885285888644234">"Συμπεριφορά πλευρικού κουμπιού"</string>
+    <string name="volume_button_setting_summary" msgid="1594641247799573198">"Ορίστε την επιθυμητή συμπεριφορά των πλαϊνών κουμπιών κατά τον ήχο του ξυπνητηριού"</string>
+  <string-array name="volume_button_setting_entries">
+    <item msgid="4520420953175098625">"Κανένα"</item>
+    <item msgid="7111908302622811168">"Αφύπνιση"</item>
+    <item msgid="8573552194573068996">"Παράβλεψη"</item>
+  </string-array>
+  <string-array name="volume_button_setting_values">
+    <item msgid="4851033050639608752">"0"</item>
+    <item msgid="3204893476515513084">"1"</item>
+    <item msgid="7687709558968154577">"2"</item>
+  </string-array>
 </resources>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index d2223e9..b7b23a1 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -18,31 +18,32 @@
     <string name="app_label" msgid="6642875149600019623">"Alarma"</string>
     <string name="add_alarm" msgid="5976616107390962899">"Agregar alarma"</string>
     <string name="delete_alarm" msgid="3457780990646206817">"Eliminar alarma"</string>
+    <string name="enable_alarm" msgid="7442658245797418741">"Activar alarma"</string>
+    <string name="disable_alarm" msgid="6665528499886549648">"Desactivar alarma"</string>
     <string name="delete_alarm_confirm" msgid="4237696873219106907">"Esta alarma se eliminará"</string>
     <string name="show_clock" msgid="8358759982675616915">"Mostrar reloj"</string>
     <string name="hide_clock" msgid="3217727306480505694">"Ocultar reloj"</string>
     <string name="label" msgid="162189613902857319">"Etiqueta"</string>
     <string name="default_label" msgid="5590025289805630372">"Alarma"</string>
     <string name="set_alarm" msgid="9148359866152726808">"Fijar alarma"</string>
-    <string name="enable" msgid="3089255608289797715">"Activar la alarma"</string>
     <string name="alarm_vibrate" msgid="3476686921490362230">"Vibrar"</string>
     <string name="alarm_repeat" msgid="7242985466344233206">"Repetir"</string>
     <string name="alert" msgid="6539852766423700221">"Timbre"</string>
     <string name="time" msgid="8067216534232296518">"Hora"</string>
-    <string name="alert_title" msgid="1600112166027371802">"Alarma"</string>
     <string name="alarm_alert_dismiss_text" msgid="4942914605480888820">"Descartar"</string>
     <string name="alarm_alert_alert_silenced" msgid="7918075929961104202">"Alarma silenciada después de <xliff:g id="MINUTES">%d</xliff:g> minutos"</string>
     <string name="alarm_alert_snooze_text" msgid="1774416052207651584">"Recurrente"</string>
     <string name="alarm_alert_snooze_set" msgid="656470966696912087">"Recurrente a los <xliff:g id="MINUTES">%d</xliff:g> minutos."</string>
-    <string name="alarm_alert_snooze_not_set" msgid="8783980489802220546">"Alarma recurrente no activada. Próxima alarma fijada a las <xliff:g id="TIME">%s</xliff:g>"</string>
-    <!-- no translation found for alarm_set:0 (5163476010406761625) -->
-    <!-- no translation found for alarm_set:1 (7110525731259629055) -->
-    <!-- no translation found for alarm_set:2 (7003982794086186185) -->
-    <!-- no translation found for alarm_set:3 (7311021123230077742) -->
-    <!-- no translation found for alarm_set:4 (8431715191823114872) -->
-    <!-- no translation found for alarm_set:5 (3244151088673185428) -->
-    <!-- no translation found for alarm_set:6 (3663661342600168814) -->
-    <!-- no translation found for alarm_set:7 (7779544127785487304) -->
+  <string-array name="alarm_set">
+    <item msgid="5163476010406761625">"Esta alarma se activará en menos de un minuto a partir de ahora."</item>
+    <item msgid="7110525731259629055">"Esta alarma se activará en <xliff:g id="DAYS">%1$s</xliff:g> a partir de ahora."</item>
+    <item msgid="7003982794086186185">"Esta alarma se activará en <xliff:g id="HOURS">%2$s</xliff:g> a partir de ahora."</item>
+    <item msgid="7311021123230077742">"Esta alarma se activará en <xliff:g id="DAYS">%1$s</xliff:g> y <xliff:g id="HOURS">%2$s</xliff:g> a partir de ahora."</item>
+    <item msgid="8431715191823114872">"Esta alarma se activará en <xliff:g id="MINUTES">%3$s</xliff:g> a partir de ahora."</item>
+    <item msgid="3244151088673185428">"Esta alarma se activará en <xliff:g id="DAYS">%1$s</xliff:g> y <xliff:g id="MINUTES">%3$s</xliff:g> a partir de ahora."</item>
+    <item msgid="3663661342600168814">"Esta alarma se activará en <xliff:g id="HOURS">%2$s</xliff:g> y <xliff:g id="MINUTES">%3$s</xliff:g> a partir de ahora."</item>
+    <item msgid="7779544127785487304">"Esta alarma se activará en <xliff:g id="DAYS">%1$s</xliff:g>, <xliff:g id="HOURS">%2$s</xliff:g> y <xliff:g id="MINUTES">%3$s</xliff:g> a partir de ahora."</item>
+  </string-array>
     <string name="day" msgid="7984755014526510295">"un día"</string>
     <string name="days" msgid="2070509222727852210">"<xliff:g id="DAYS">%s</xliff:g> días"</string>
     <string name="hour" msgid="2546819039651509323">"1 hora"</string>
@@ -53,10 +54,45 @@
     <string name="never" msgid="54104287800571769">"Nunca"</string>
     <string name="day_concat" msgid="971998564991636532">", "</string>
     <string name="clock_instructions" msgid="3118560284915857690">"Selecciona un reloj."</string>
-    <string name="error" msgid="108628064084462722">"Alarma no fijada"</string>
-    <string name="dberror" msgid="6922426026866330853">"La alarma no se ha podido fijar."</string>
     <string name="analog_gadget" msgid="1670505720837152766">"Reloj analógico"</string>
     <string name="settings" msgid="5849739030579520686">"Configuración"</string>
     <string name="alarm_in_silent_mode_title" msgid="3892612644543516705">"Alarma en modo silencioso"</string>
     <string name="alarm_in_silent_mode_summary" msgid="6042500263899922832">"Reproducir alarma cuando el teléfono está en modo silencioso"</string>
+    <string name="snooze_duration_title" msgid="1471249885139952670">"Duración de recurrencia"</string>
+  <string-array name="snooze_duration_entries">
+    <item msgid="8337408933053603125">"5 minutos"</item>
+    <item msgid="5294206441496024610">"10 minutos"</item>
+    <item msgid="2165904039211935470">"15 minutos"</item>
+    <item msgid="7248236967714374250">"20 minutos"</item>
+    <item msgid="738394723625179423">"25 minutos"</item>
+    <item msgid="1180222611308391616">"30 minutos"</item>
+  </string-array>
+  <string-array name="snooze_duration_values">
+    <item msgid="3655014754453084122">"5"</item>
+    <item msgid="8939029597449573449">"10"</item>
+    <item msgid="3922647341176353315">"15"</item>
+    <item msgid="5821804105985044459">"20"</item>
+    <item msgid="6048861883552402852">"25"</item>
+    <item msgid="2740866721232379791">"30"</item>
+  </string-array>
+    <string name="done" msgid="6509722361933858451">"Finalizado"</string>
+    <string name="revert" msgid="9100911171235162926">"Revertir"</string>
+    <string name="alarm_volume_title" msgid="8506245173912428522">"Volumen de la alarma"</string>
+    <string name="alarm_volume_summary" msgid="8957440373896242438">"Establecer el volumen de las alarmas"</string>
+    <string name="silent_alarm_summary" msgid="8605302849408279221">"Silencioso"</string>
+    <string name="alarm_notify_text" msgid="4146350965933990093">"Seleccionar alarma recurrente o rechazar."</string>
+    <string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (recurrente)"</string>
+    <string name="alarm_notify_snooze_text" msgid="8004830999152609519">"Esta alarma se activará en <xliff:g id="TIME">%s</xliff:g>. Selecciona para cancelar."</string>
+    <string name="volume_button_setting_title" msgid="1892885285888644234">"Comportamiento del botón lateral"</string>
+    <string name="volume_button_setting_summary" msgid="1594641247799573198">"Activar el comportamiento deseado de los botones laterales cuando se presionen durante una alarma"</string>
+  <string-array name="volume_button_setting_entries">
+    <item msgid="4520420953175098625">"Ninguno"</item>
+    <item msgid="7111908302622811168">"Recurrente"</item>
+    <item msgid="8573552194573068996">"Descartar"</item>
+  </string-array>
+  <string-array name="volume_button_setting_values">
+    <item msgid="4851033050639608752">"0"</item>
+    <item msgid="3204893476515513084">"1"</item>
+    <item msgid="7687709558968154577">"2"</item>
+  </string-array>
 </resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index fbbae19..0703746 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -18,23 +18,22 @@
     <string name="app_label" msgid="6642875149600019623">"Alarma"</string>
     <string name="add_alarm" msgid="5976616107390962899">"Añadir alarma"</string>
     <string name="delete_alarm" msgid="3457780990646206817">"Eliminar alarma"</string>
+    <string name="enable_alarm" msgid="7442658245797418741">"Activar alarma"</string>
+    <string name="disable_alarm" msgid="6665528499886549648">"Desactivar alarma"</string>
     <string name="delete_alarm_confirm" msgid="4237696873219106907">"Esta alarma se eliminará."</string>
     <string name="show_clock" msgid="8358759982675616915">"Mostrar reloj"</string>
     <string name="hide_clock" msgid="3217727306480505694">"Ocultar reloj"</string>
     <string name="label" msgid="162189613902857319">"Etiqueta"</string>
     <string name="default_label" msgid="5590025289805630372">"Alarma"</string>
     <string name="set_alarm" msgid="9148359866152726808">"Establecer alarma"</string>
-    <string name="enable" msgid="3089255608289797715">"Activar alarma"</string>
     <string name="alarm_vibrate" msgid="3476686921490362230">"Vibración"</string>
     <string name="alarm_repeat" msgid="7242985466344233206">"Repetir"</string>
     <string name="alert" msgid="6539852766423700221">"Tono"</string>
     <string name="time" msgid="8067216534232296518">"Hora"</string>
-    <string name="alert_title" msgid="1600112166027371802">"Alarma"</string>
     <string name="alarm_alert_dismiss_text" msgid="4942914605480888820">"Descartar"</string>
     <string name="alarm_alert_alert_silenced" msgid="7918075929961104202">"La alarma se ha silenciado después de <xliff:g id="MINUTES">%d</xliff:g> minutos."</string>
     <string name="alarm_alert_snooze_text" msgid="1774416052207651584">"Posponer"</string>
     <string name="alarm_alert_snooze_set" msgid="656470966696912087">"La alarma volverá a sonar en <xliff:g id="MINUTES">%d</xliff:g> minutos."</string>
-    <string name="alarm_alert_snooze_not_set" msgid="8783980489802220546">"No se ha pospuesto la alarma, ya que la siguiente alarma sonará a las <xliff:g id="TIME">%s</xliff:g>."</string>
   <string-array name="alarm_set">
     <item msgid="5163476010406761625">"La alarma sonará en menos de un minuto."</item>
     <item msgid="7110525731259629055">"La alarma sonará en <xliff:g id="DAYS">%1$s</xliff:g>."</item>
@@ -55,10 +54,45 @@
     <string name="never" msgid="54104287800571769">"Nunca"</string>
     <string name="day_concat" msgid="971998564991636532">", "</string>
     <string name="clock_instructions" msgid="3118560284915857690">"Selecciona el reloj que quieras ver."</string>
-    <string name="error" msgid="108628064084462722">"Alarma no establecida"</string>
-    <string name="dberror" msgid="6922426026866330853">"No se ha podido establecer la alarma."</string>
     <string name="analog_gadget" msgid="1670505720837152766">"Reloj analógico"</string>
     <string name="settings" msgid="5849739030579520686">"Configuración"</string>
     <string name="alarm_in_silent_mode_title" msgid="3892612644543516705">"Alarma en modo silencio"</string>
     <string name="alarm_in_silent_mode_summary" msgid="6042500263899922832">"Reproducir alarma aunque el teléfono esté en modo silencio"</string>
+    <string name="snooze_duration_title" msgid="1471249885139952670">"Duración de la posposición"</string>
+  <string-array name="snooze_duration_entries">
+    <item msgid="8337408933053603125">"5 minutos"</item>
+    <item msgid="5294206441496024610">"10 minutos"</item>
+    <item msgid="2165904039211935470">"15 minutos"</item>
+    <item msgid="7248236967714374250">"20 minutos"</item>
+    <item msgid="738394723625179423">"25 minutos"</item>
+    <item msgid="1180222611308391616">"30 minutos"</item>
+  </string-array>
+  <string-array name="snooze_duration_values">
+    <item msgid="3655014754453084122">"5"</item>
+    <item msgid="8939029597449573449">"10"</item>
+    <item msgid="3922647341176353315">"15"</item>
+    <item msgid="5821804105985044459">"20"</item>
+    <item msgid="6048861883552402852">"25"</item>
+    <item msgid="2740866721232379791">"30"</item>
+  </string-array>
+    <string name="done" msgid="6509722361933858451">"Hecho"</string>
+    <string name="revert" msgid="9100911171235162926">"Revertir"</string>
+    <string name="alarm_volume_title" msgid="8506245173912428522">"Volumen de alarma"</string>
+    <string name="alarm_volume_summary" msgid="8957440373896242438">"Establecer el volumen de las alarmas"</string>
+    <string name="silent_alarm_summary" msgid="8605302849408279221">"Silencio"</string>
+    <string name="alarm_notify_text" msgid="4146350965933990093">"Elija si desea posponer o descartar esta alarma."</string>
+    <string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (pospuesta)"</string>
+    <string name="alarm_notify_snooze_text" msgid="8004830999152609519">"La alarma sonará a las <xliff:g id="TIME">%s</xliff:g>. Seleccione la opción para cancelarla."</string>
+    <string name="volume_button_setting_title" msgid="1892885285888644234">"Comportamiento de botón lateral"</string>
+    <string name="volume_button_setting_summary" msgid="1594641247799573198">"Establecer el comportamiento deseado de los botones laterales cuando se pulsan durante una alarma"</string>
+  <string-array name="volume_button_setting_entries">
+    <item msgid="4520420953175098625">"Ninguno"</item>
+    <item msgid="7111908302622811168">"Posponer"</item>
+    <item msgid="8573552194573068996">"Descartar"</item>
+  </string-array>
+  <string-array name="volume_button_setting_values">
+    <item msgid="4851033050639608752">"0"</item>
+    <item msgid="3204893476515513084">"1"</item>
+    <item msgid="7687709558968154577">"2"</item>
+  </string-array>
 </resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 98981b9..2017030 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -18,23 +18,22 @@
     <string name="app_label" msgid="6642875149600019623">"Réveil"</string>
     <string name="add_alarm" msgid="5976616107390962899">"Ajouter alarme"</string>
     <string name="delete_alarm" msgid="3457780990646206817">"Désactiver l\'alarme"</string>
+    <string name="enable_alarm" msgid="7442658245797418741">"Activer l\'alarme"</string>
+    <string name="disable_alarm" msgid="6665528499886549648">"Désactiver l\'alarme"</string>
     <string name="delete_alarm_confirm" msgid="4237696873219106907">"Cette alarme va être supprimée."</string>
     <string name="show_clock" msgid="8358759982675616915">"Afficher l\'horloge"</string>
     <string name="hide_clock" msgid="3217727306480505694">"Masquer l\'horloge"</string>
     <string name="label" msgid="162189613902857319">"Libellé"</string>
     <string name="default_label" msgid="5590025289805630372">"Alarme"</string>
     <string name="set_alarm" msgid="9148359866152726808">"Régler l\'alarme"</string>
-    <string name="enable" msgid="3089255608289797715">"Activer l\'alarme"</string>
     <string name="alarm_vibrate" msgid="3476686921490362230">"Vibreur"</string>
     <string name="alarm_repeat" msgid="7242985466344233206">"Répéter"</string>
     <string name="alert" msgid="6539852766423700221">"Sonnerie"</string>
     <string name="time" msgid="8067216534232296518">"Heure"</string>
-    <string name="alert_title" msgid="1600112166027371802">"Alarme"</string>
     <string name="alarm_alert_dismiss_text" msgid="4942914605480888820">"Quitter"</string>
     <string name="alarm_alert_alert_silenced" msgid="7918075929961104202">"Alarme interrompue après <xliff:g id="MINUTES">%d</xliff:g> minutes"</string>
     <string name="alarm_alert_snooze_text" msgid="1774416052207651584">"Répéter"</string>
     <string name="alarm_alert_snooze_set" msgid="656470966696912087">"Répétition dans <xliff:g id="MINUTES">%d</xliff:g> minutes."</string>
-    <string name="alarm_alert_snooze_not_set" msgid="8783980489802220546">"Répétition non activée : prochaine alarme à <xliff:g id="TIME">%s</xliff:g>"</string>
   <string-array name="alarm_set">
     <item msgid="5163476010406761625">"Prochaine alarme dans moins d\'une minute."</item>
     <item msgid="7110525731259629055">"Prochaine alarme dans <xliff:g id="DAYS">%1$s</xliff:g>."</item>
@@ -55,10 +54,45 @@
     <string name="never" msgid="54104287800571769">"Jamais"</string>
     <string name="day_concat" msgid="971998564991636532">", "</string>
     <string name="clock_instructions" msgid="3118560284915857690">"Sélectionnez une horloge à afficher."</string>
-    <string name="error" msgid="108628064084462722">"Alarme non activée"</string>
-    <string name="dberror" msgid="6922426026866330853">"Désolé, impossible de régler l\'alarme."</string>
     <string name="analog_gadget" msgid="1670505720837152766">"Horloge analogique"</string>
     <string name="settings" msgid="5849739030579520686">"Paramètres"</string>
     <string name="alarm_in_silent_mode_title" msgid="3892612644543516705">"Alarme mode silencieux"</string>
     <string name="alarm_in_silent_mode_summary" msgid="6042500263899922832">"Faire sonner l\'alarme même lorsque le téléphone est en mode silencieux."</string>
+    <string name="snooze_duration_title" msgid="1471249885139952670">"Répéter après"</string>
+  <string-array name="snooze_duration_entries">
+    <item msgid="8337408933053603125">"5 minutes"</item>
+    <item msgid="5294206441496024610">"10 minutes"</item>
+    <item msgid="2165904039211935470">"15 minutes"</item>
+    <item msgid="7248236967714374250">"20 minutes"</item>
+    <item msgid="738394723625179423">"25 minutes"</item>
+    <item msgid="1180222611308391616">"30 minutes"</item>
+  </string-array>
+  <string-array name="snooze_duration_values">
+    <item msgid="3655014754453084122">"5"</item>
+    <item msgid="8939029597449573449">"10"</item>
+    <item msgid="3922647341176353315">"15"</item>
+    <item msgid="5821804105985044459">"20"</item>
+    <item msgid="6048861883552402852">"25"</item>
+    <item msgid="2740866721232379791">"30"</item>
+  </string-array>
+    <string name="done" msgid="6509722361933858451">"Terminé"</string>
+    <string name="revert" msgid="9100911171235162926">"Annuler"</string>
+    <string name="alarm_volume_title" msgid="8506245173912428522">"Volume"</string>
+    <string name="alarm_volume_summary" msgid="8957440373896242438">"Définir le volume des alarmes"</string>
+    <string name="silent_alarm_summary" msgid="8605302849408279221">"Silencieuse"</string>
+    <string name="alarm_notify_text" msgid="4146350965933990093">"Choisissez de répéter ou de désactiver cette alarme."</string>
+    <string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (répétition)"</string>
+    <string name="alarm_notify_snooze_text" msgid="8004830999152609519">"Prochaine alarme dans <xliff:g id="TIME">%s</xliff:g>. Sélectionnez l\'option appropriée pour annuler."</string>
+    <string name="volume_button_setting_title" msgid="1892885285888644234">"Action du bouton latéral"</string>
+    <string name="volume_button_setting_summary" msgid="1594641247799573198">"Définissez les actions effectuées par les boutons latéraux lors d\'une alarme."</string>
+  <string-array name="volume_button_setting_entries">
+    <item msgid="4520420953175098625">"Aucune"</item>
+    <item msgid="7111908302622811168">"Répéter"</item>
+    <item msgid="8573552194573068996">"Désactiver"</item>
+  </string-array>
+  <string-array name="volume_button_setting_values">
+    <item msgid="4851033050639608752">"0"</item>
+    <item msgid="3204893476515513084">"1"</item>
+    <item msgid="7687709558968154577">"2"</item>
+  </string-array>
 </resources>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 2cad76f..1989fb3 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -18,23 +18,22 @@
     <string name="app_label" msgid="6642875149600019623">"Sveglia"</string>
     <string name="add_alarm" msgid="5976616107390962899">"Aggiungi allarme"</string>
     <string name="delete_alarm" msgid="3457780990646206817">"Elimina allarme"</string>
+    <string name="enable_alarm" msgid="7442658245797418741">"Attiva allarme"</string>
+    <string name="disable_alarm" msgid="6665528499886549648">"Disattiva allarme"</string>
     <string name="delete_alarm_confirm" msgid="4237696873219106907">"Questa sveglia verrà eliminata."</string>
     <string name="show_clock" msgid="8358759982675616915">"Mostra orologio"</string>
     <string name="hide_clock" msgid="3217727306480505694">"Nascondi orologio"</string>
     <string name="label" msgid="162189613902857319">"Etichetta"</string>
     <string name="default_label" msgid="5590025289805630372">"Allarme"</string>
     <string name="set_alarm" msgid="9148359866152726808">"Imposta allarme"</string>
-    <string name="enable" msgid="3089255608289797715">"Attiva allarme"</string>
     <string name="alarm_vibrate" msgid="3476686921490362230">"Vibrazione"</string>
     <string name="alarm_repeat" msgid="7242985466344233206">"Ripeti"</string>
     <string name="alert" msgid="6539852766423700221">"Suoneria"</string>
     <string name="time" msgid="8067216534232296518">"Ora"</string>
-    <string name="alert_title" msgid="1600112166027371802">"Allarme"</string>
     <string name="alarm_alert_dismiss_text" msgid="4942914605480888820">"Spegni"</string>
     <string name="alarm_alert_alert_silenced" msgid="7918075929961104202">"Tono allarme disattivato dopo <xliff:g id="MINUTES">%d</xliff:g> minuti"</string>
     <string name="alarm_alert_snooze_text" msgid="1774416052207651584">"Posponi"</string>
     <string name="alarm_alert_snooze_set" msgid="656470966696912087">"Sospensione per <xliff:g id="MINUTES">%d</xliff:g> minuti."</string>
-    <string name="alarm_alert_snooze_not_set" msgid="8783980489802220546">"Sospensione non impostata. Prossimo allarme alle <xliff:g id="TIME">%s</xliff:g>"</string>
   <string-array name="alarm_set">
     <item msgid="5163476010406761625">"L\'allarme sarà attivato fra meno di 1 minuto."</item>
     <item msgid="7110525731259629055">"L\'allarme sarà attivato fra <xliff:g id="DAYS">%1$s</xliff:g>."</item>
@@ -55,10 +54,45 @@
     <string name="never" msgid="54104287800571769">"Mai"</string>
     <string name="day_concat" msgid="971998564991636532">", "</string>
     <string name="clock_instructions" msgid="3118560284915857690">"Seleziona un orologio."</string>
-    <string name="error" msgid="108628064084462722">"Allarme non impostato"</string>
-    <string name="dberror" msgid="6922426026866330853">"Spiacenti. Impossibile impostare l\'allarme."</string>
     <string name="analog_gadget" msgid="1670505720837152766">"Orologio analogico"</string>
     <string name="settings" msgid="5849739030579520686">"Impostazioni"</string>
     <string name="alarm_in_silent_mode_title" msgid="3892612644543516705">"Allarme in mod. silenziosa"</string>
     <string name="alarm_in_silent_mode_summary" msgid="6042500263899922832">"Riproduci allarme anche con telefono in modalità silenziosa"</string>
+    <string name="snooze_duration_title" msgid="1471249885139952670">"Durata sospensione"</string>
+  <string-array name="snooze_duration_entries">
+    <item msgid="8337408933053603125">"5 minuti"</item>
+    <item msgid="5294206441496024610">"10 minuti"</item>
+    <item msgid="2165904039211935470">"15 minuti"</item>
+    <item msgid="7248236967714374250">"20 minuti"</item>
+    <item msgid="738394723625179423">"25 minuti"</item>
+    <item msgid="1180222611308391616">"30 minuti"</item>
+  </string-array>
+  <string-array name="snooze_duration_values">
+    <item msgid="3655014754453084122">"5"</item>
+    <item msgid="8939029597449573449">"10"</item>
+    <item msgid="3922647341176353315">"15"</item>
+    <item msgid="5821804105985044459">"20"</item>
+    <item msgid="6048861883552402852">"25"</item>
+    <item msgid="2740866721232379791">"30"</item>
+  </string-array>
+    <string name="done" msgid="6509722361933858451">"Fine"</string>
+    <string name="revert" msgid="9100911171235162926">"Annulla modifiche"</string>
+    <string name="alarm_volume_title" msgid="8506245173912428522">"Volume allarme"</string>
+    <string name="alarm_volume_summary" msgid="8957440373896242438">"Imposta il volume degli allarmi"</string>
+    <string name="silent_alarm_summary" msgid="8605302849408279221">"Silenzioso"</string>
+    <string name="alarm_notify_text" msgid="4146350965933990093">"Seleziona per sospendere o eliminare questo allarme."</string>
+    <string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (sospeso)"</string>
+    <string name="alarm_notify_snooze_text" msgid="8004830999152609519">"L\'allarme sarà attivato alle <xliff:g id="TIME">%s</xliff:g>. Seleziona per annullare."</string>
+    <string name="volume_button_setting_title" msgid="1892885285888644234">"Comportamento pulsante laterale"</string>
+    <string name="volume_button_setting_summary" msgid="1594641247799573198">"Imposta il comportamento desiderato dei pulsanti laterali quando vengono premuti durante un allarme"</string>
+  <string-array name="volume_button_setting_entries">
+    <item msgid="4520420953175098625">"Nessuno"</item>
+    <item msgid="7111908302622811168">"Sospendi"</item>
+    <item msgid="8573552194573068996">"Elimina"</item>
+  </string-array>
+  <string-array name="volume_button_setting_values">
+    <item msgid="4851033050639608752">"0"</item>
+    <item msgid="3204893476515513084">"1"</item>
+    <item msgid="7687709558968154577">"2"</item>
+  </string-array>
 </resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 241a607..65ccbfb 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -18,23 +18,22 @@
     <string name="app_label" msgid="6642875149600019623">"アラーム"</string>
     <string name="add_alarm" msgid="5976616107390962899">"アラームの設定"</string>
     <string name="delete_alarm" msgid="3457780990646206817">"アラームを削除"</string>
+    <string name="enable_alarm" msgid="7442658245797418741">"アラームON"</string>
+    <string name="disable_alarm" msgid="6665528499886549648">"アラームOFF"</string>
     <string name="delete_alarm_confirm" msgid="4237696873219106907">"このアラームを削除します。"</string>
     <string name="show_clock" msgid="8358759982675616915">"時計を表示"</string>
     <string name="hide_clock" msgid="3217727306480505694">"時計を隠す"</string>
     <string name="label" msgid="162189613902857319">"ラベル"</string>
     <string name="default_label" msgid="5590025289805630372">"アラーム"</string>
     <string name="set_alarm" msgid="9148359866152726808">"アラームを設定"</string>
-    <string name="enable" msgid="3089255608289797715">"アラームをONにする"</string>
     <string name="alarm_vibrate" msgid="3476686921490362230">"バイブレーション"</string>
     <string name="alarm_repeat" msgid="7242985466344233206">"繰り返し"</string>
     <string name="alert" msgid="6539852766423700221">"アラーム音"</string>
     <string name="time" msgid="8067216534232296518">"時刻"</string>
-    <string name="alert_title" msgid="1600112166027371802">"アラーム"</string>
     <string name="alarm_alert_dismiss_text" msgid="4942914605480888820">"停止"</string>
     <string name="alarm_alert_alert_silenced" msgid="7918075929961104202">"アラームは<xliff:g id="MINUTES">%d</xliff:g>分間鳴って止まりました"</string>
     <string name="alarm_alert_snooze_text" msgid="1774416052207651584">"スヌーズ"</string>
     <string name="alarm_alert_snooze_set" msgid="656470966696912087">"<xliff:g id="MINUTES">%d</xliff:g>分後に再通知します"</string>
-    <string name="alarm_alert_snooze_not_set" msgid="8783980489802220546">"スヌーズにできません: <xliff:g id="TIME">%s</xliff:g>に次のアラームが設定されています"</string>
   <string-array name="alarm_set">
     <item msgid="5163476010406761625">"アラームは今から1分以内に設定されています。"</item>
     <item msgid="7110525731259629055">"アラームは<xliff:g id="DAYS">%1$s</xliff:g>日後に設定されています。"</item>
@@ -55,10 +54,45 @@
     <string name="never" msgid="54104287800571769">"繰り返しなし"</string>
     <string name="day_concat" msgid="971998564991636532">"、 "</string>
     <string name="clock_instructions" msgid="3118560284915857690">"表示する時計を選択してください。"</string>
-    <string name="error" msgid="108628064084462722">"アラームを設定できません"</string>
-    <string name="dberror" msgid="6922426026866330853">"アラームを設定できません"</string>
     <string name="analog_gadget" msgid="1670505720837152766">"アナログ時計"</string>
     <string name="settings" msgid="5849739030579520686">"設定"</string>
     <string name="alarm_in_silent_mode_title" msgid="3892612644543516705">"マナーモード中のアラーム"</string>
     <string name="alarm_in_silent_mode_summary" msgid="6042500263899922832">"マナーモード中もアラームを鳴らす"</string>
+    <string name="snooze_duration_title" msgid="1471249885139952670">"スヌーズ間隔"</string>
+  <string-array name="snooze_duration_entries">
+    <item msgid="8337408933053603125">"5分"</item>
+    <item msgid="5294206441496024610">"10分"</item>
+    <item msgid="2165904039211935470">"15分"</item>
+    <item msgid="7248236967714374250">"20分"</item>
+    <item msgid="738394723625179423">"25分"</item>
+    <item msgid="1180222611308391616">"30分"</item>
+  </string-array>
+  <string-array name="snooze_duration_values">
+    <item msgid="3655014754453084122">"5"</item>
+    <item msgid="8939029597449573449">"10"</item>
+    <item msgid="3922647341176353315">"15"</item>
+    <item msgid="5821804105985044459">"20"</item>
+    <item msgid="6048861883552402852">"25"</item>
+    <item msgid="2740866721232379791">"30"</item>
+  </string-array>
+    <string name="done" msgid="6509722361933858451">"完了"</string>
+    <string name="revert" msgid="9100911171235162926">"キャンセル"</string>
+    <string name="alarm_volume_title" msgid="8506245173912428522">"アラームの音量"</string>
+    <string name="alarm_volume_summary" msgid="8957440373896242438">"アラームの音量を設定します"</string>
+    <string name="silent_alarm_summary" msgid="8605302849408279221">"マナーモード"</string>
+    <string name="alarm_notify_text" msgid="4146350965933990093">"アラームのスヌーズ/解除を選択します。"</string>
+    <string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g>(スヌーズ)"</string>
+    <string name="alarm_notify_snooze_text" msgid="8004830999152609519">"アラームは<xliff:g id="TIME">%s</xliff:g>に設定されています。選択すると解除されます。"</string>
+    <string name="volume_button_setting_title" msgid="1892885285888644234">"サイドボタンの動作"</string>
+    <string name="volume_button_setting_summary" msgid="1594641247799573198">"アラームが鳴っているときにサイドボタンを押した場合の動作を設定します"</string>
+  <string-array name="volume_button_setting_entries">
+    <item msgid="4520420953175098625">"なし"</item>
+    <item msgid="7111908302622811168">"スヌーズ"</item>
+    <item msgid="8573552194573068996">"解除"</item>
+  </string-array>
+  <string-array name="volume_button_setting_values">
+    <item msgid="4851033050639608752">"0"</item>
+    <item msgid="3204893476515513084">"1"</item>
+    <item msgid="7687709558968154577">"2"</item>
+  </string-array>
 </resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 8ceb1e8..067b051 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -15,34 +15,35 @@
 -->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="6642875149600019623">"알람 시계"</string>
+    <string name="app_label" msgid="6642875149600019623">"알람"</string>
     <string name="add_alarm" msgid="5976616107390962899">"알람 추가"</string>
     <string name="delete_alarm" msgid="3457780990646206817">"알람 삭제"</string>
+    <string name="enable_alarm" msgid="7442658245797418741">"알람 사용"</string>
+    <string name="disable_alarm" msgid="6665528499886549648">"알람 사용 중지"</string>
     <string name="delete_alarm_confirm" msgid="4237696873219106907">"알람이 삭제됩니다."</string>
     <string name="show_clock" msgid="8358759982675616915">"시계 표시"</string>
     <string name="hide_clock" msgid="3217727306480505694">"시계 숨기기"</string>
     <string name="label" msgid="162189613902857319">"라벨"</string>
     <string name="default_label" msgid="5590025289805630372">"알람"</string>
     <string name="set_alarm" msgid="9148359866152726808">"알람 설정"</string>
-    <string name="enable" msgid="3089255608289797715">"알람 사용"</string>
     <string name="alarm_vibrate" msgid="3476686921490362230">"진동"</string>
     <string name="alarm_repeat" msgid="7242985466344233206">"반복"</string>
     <string name="alert" msgid="6539852766423700221">"벨소리"</string>
     <string name="time" msgid="8067216534232296518">"시간"</string>
-    <string name="alert_title" msgid="1600112166027371802">"알람"</string>
     <string name="alarm_alert_dismiss_text" msgid="4942914605480888820">"해제"</string>
     <string name="alarm_alert_alert_silenced" msgid="7918075929961104202">"<xliff:g id="MINUTES">%d</xliff:g>분 후 알람이 중지됨"</string>
     <string name="alarm_alert_snooze_text" msgid="1774416052207651584">"다시 울림"</string>
     <string name="alarm_alert_snooze_set" msgid="656470966696912087">"<xliff:g id="MINUTES">%d</xliff:g>분 동안 알람 일시 중지"</string>
-    <string name="alarm_alert_snooze_not_set" msgid="8783980489802220546">"다시 울림을 설정할 수 없음 -- 다음 알람 <xliff:g id="TIME">%s</xliff:g>"</string>
-    <!-- no translation found for alarm_set:0 (5163476010406761625) -->
-    <!-- no translation found for alarm_set:1 (7110525731259629055) -->
-    <!-- no translation found for alarm_set:2 (7003982794086186185) -->
-    <!-- no translation found for alarm_set:3 (7311021123230077742) -->
-    <!-- no translation found for alarm_set:4 (8431715191823114872) -->
-    <!-- no translation found for alarm_set:5 (3244151088673185428) -->
-    <!-- no translation found for alarm_set:6 (3663661342600168814) -->
-    <!-- no translation found for alarm_set:7 (7779544127785487304) -->
+  <string-array name="alarm_set">
+    <item msgid="5163476010406761625">"지금부터 1분 미만 후로 알람이 설정됩니다."</item>
+    <item msgid="7110525731259629055">"지금부터 <xliff:g id="DAYS">%1$s</xliff:g> 후로 알람이 설정됩니다."</item>
+    <item msgid="7003982794086186185">"지금부터 <xliff:g id="HOURS">%2$s</xliff:g> 후로 알람이 설정됩니다."</item>
+    <item msgid="7311021123230077742">"지금부터 <xliff:g id="DAYS">%1$s</xliff:g> <xliff:g id="HOURS">%2$s</xliff:g> 후로 알람이 설정됩니다."</item>
+    <item msgid="8431715191823114872">"지금부터 <xliff:g id="MINUTES">%3$s</xliff:g> 후로 알람이 설정됩니다."</item>
+    <item msgid="3244151088673185428">"지금부터 <xliff:g id="DAYS">%1$s</xliff:g> <xliff:g id="MINUTES">%3$s</xliff:g> 후로 알람이 설정됩니다."</item>
+    <item msgid="3663661342600168814">"지금부터 <xliff:g id="HOURS">%2$s</xliff:g> <xliff:g id="MINUTES">%3$s</xliff:g> 후로 알람이 설정됩니다."</item>
+    <item msgid="7779544127785487304">"지금부터 <xliff:g id="DAYS">%1$s</xliff:g> <xliff:g id="HOURS">%2$s</xliff:g> <xliff:g id="MINUTES">%3$s</xliff:g> 후로 알람이 설정됩니다."</item>
+  </string-array>
     <string name="day" msgid="7984755014526510295">"1일"</string>
     <string name="days" msgid="2070509222727852210">"<xliff:g id="DAYS">%s</xliff:g>일"</string>
     <string name="hour" msgid="2546819039651509323">"1시간"</string>
@@ -53,10 +54,45 @@
     <string name="never" msgid="54104287800571769">"반복 안함"</string>
     <string name="day_concat" msgid="971998564991636532">", "</string>
     <string name="clock_instructions" msgid="3118560284915857690">"표시할 시계를 선택하세요."</string>
-    <string name="error" msgid="108628064084462722">"알람 설정 안됨"</string>
-    <string name="dberror" msgid="6922426026866330853">"죄송합니다. 알람을 설정할 수 없습니다."</string>
     <string name="analog_gadget" msgid="1670505720837152766">"아날로그 시계"</string>
     <string name="settings" msgid="5849739030579520686">"설정"</string>
     <string name="alarm_in_silent_mode_title" msgid="3892612644543516705">"무음 모드로 알람 설정"</string>
     <string name="alarm_in_silent_mode_summary" msgid="6042500263899922832">"무음 모드에서도 알람이 울리도록 설정"</string>
+    <string name="snooze_duration_title" msgid="1471249885139952670">"다시 울림 간격"</string>
+  <string-array name="snooze_duration_entries">
+    <item msgid="8337408933053603125">"5분"</item>
+    <item msgid="5294206441496024610">"10분"</item>
+    <item msgid="2165904039211935470">"15분"</item>
+    <item msgid="7248236967714374250">"20분"</item>
+    <item msgid="738394723625179423">"25분"</item>
+    <item msgid="1180222611308391616">"30분"</item>
+  </string-array>
+  <string-array name="snooze_duration_values">
+    <item msgid="3655014754453084122">"5"</item>
+    <item msgid="8939029597449573449">"10"</item>
+    <item msgid="3922647341176353315">"15"</item>
+    <item msgid="5821804105985044459">"20"</item>
+    <item msgid="6048861883552402852">"25"</item>
+    <item msgid="2740866721232379791">"30"</item>
+  </string-array>
+    <string name="done" msgid="6509722361933858451">"완료"</string>
+    <string name="revert" msgid="9100911171235162926">"되돌리기"</string>
+    <string name="alarm_volume_title" msgid="8506245173912428522">"알람 볼륨"</string>
+    <string name="alarm_volume_summary" msgid="8957440373896242438">"알람 볼륨 설정"</string>
+    <string name="silent_alarm_summary" msgid="8605302849408279221">"무음"</string>
+    <string name="alarm_notify_text" msgid="4146350965933990093">"알람을 일시 중지하거나 해제하려면 선택하세요."</string>
+    <string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g>(알람 일시 중지됨)"</string>
+    <string name="alarm_notify_snooze_text" msgid="8004830999152609519">"<xliff:g id="TIME">%s</xliff:g> 후로 알람이 설정되었습니다. 취소하려면 선택하세요."</string>
+    <string name="volume_button_setting_title" msgid="1892885285888644234">"사이드 버튼 동작"</string>
+    <string name="volume_button_setting_summary" msgid="1594641247799573198">"알람이 울리는 동안 사이드 버튼을 눌렀을 때의 동작 설정"</string>
+  <string-array name="volume_button_setting_entries">
+    <item msgid="4520420953175098625">"없음"</item>
+    <item msgid="7111908302622811168">"다시 울림"</item>
+    <item msgid="8573552194573068996">"취소"</item>
+  </string-array>
+  <string-array name="volume_button_setting_values">
+    <item msgid="4851033050639608752">"0"</item>
+    <item msgid="3204893476515513084">"1"</item>
+    <item msgid="7687709558968154577">"2"</item>
+  </string-array>
 </resources>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index e4d1466..9036899 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -15,34 +15,35 @@
 -->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_label" msgid="6642875149600019623">"Alarmklokke"</string>
+    <string name="app_label" msgid="6642875149600019623">"Alarm"</string>
     <string name="add_alarm" msgid="5976616107390962899">"Legg til alarm"</string>
     <string name="delete_alarm" msgid="3457780990646206817">"Slett alarm"</string>
+    <string name="enable_alarm" msgid="7442658245797418741">"Aktiver alarm"</string>
+    <string name="disable_alarm" msgid="6665528499886549648">"Deaktiver alarm"</string>
     <string name="delete_alarm_confirm" msgid="4237696873219106907">"Denne alarmen vil bli slettet."</string>
     <string name="show_clock" msgid="8358759982675616915">"Vis klokke"</string>
     <string name="hide_clock" msgid="3217727306480505694">"Skjul klokke"</string>
     <string name="label" msgid="162189613902857319">"Etikett"</string>
     <string name="default_label" msgid="5590025289805630372">"Alarm"</string>
     <string name="set_alarm" msgid="9148359866152726808">"Sett alarm"</string>
-    <string name="enable" msgid="3089255608289797715">"Slå på alarm"</string>
     <string name="alarm_vibrate" msgid="3476686921490362230">"Vibrer"</string>
     <string name="alarm_repeat" msgid="7242985466344233206">"Gjenta"</string>
     <string name="alert" msgid="6539852766423700221">"Ringetone"</string>
     <string name="time" msgid="8067216534232296518">"Tidspunkt"</string>
-    <string name="alert_title" msgid="1600112166027371802">"Alarm"</string>
     <string name="alarm_alert_dismiss_text" msgid="4942914605480888820">"Slå av"</string>
     <string name="alarm_alert_alert_silenced" msgid="7918075929961104202">"Alarmen ble slått av etter <xliff:g id="MINUTES">%d</xliff:g> minutter"</string>
     <string name="alarm_alert_snooze_text" msgid="1774416052207651584">"Slumre"</string>
     <string name="alarm_alert_snooze_set" msgid="656470966696912087">"Slumrer i <xliff:g id="MINUTES">%d</xliff:g> minutter."</string>
-    <string name="alarm_alert_snooze_not_set" msgid="8783980489802220546">"Ikke slumring -- neste alarm utløses <xliff:g id="TIME">%s</xliff:g>"</string>
-    <!-- no translation found for alarm_set:0 (5163476010406761625) -->
-    <!-- no translation found for alarm_set:1 (7110525731259629055) -->
-    <!-- no translation found for alarm_set:2 (7003982794086186185) -->
-    <!-- no translation found for alarm_set:3 (7311021123230077742) -->
-    <!-- no translation found for alarm_set:4 (8431715191823114872) -->
-    <!-- no translation found for alarm_set:5 (3244151088673185428) -->
-    <!-- no translation found for alarm_set:6 (3663661342600168814) -->
-    <!-- no translation found for alarm_set:7 (7779544127785487304) -->
+  <string-array name="alarm_set">
+    <item msgid="5163476010406761625">"Alarmen ringer om mindre enn ett minutt."</item>
+    <item msgid="7110525731259629055">"Alarmen ringer om <xliff:g id="DAYS">%1$s</xliff:g>."</item>
+    <item msgid="7003982794086186185">"Alarmen ringer om <xliff:g id="HOURS">%2$s</xliff:g>."</item>
+    <item msgid="7311021123230077742">"Alarmen ringer om <xliff:g id="DAYS">%1$s</xliff:g> og <xliff:g id="HOURS">%2$s</xliff:g>."</item>
+    <item msgid="8431715191823114872">"Alarmen ringer om <xliff:g id="MINUTES">%3$s</xliff:g>."</item>
+    <item msgid="3244151088673185428">"Alarmen ringer om <xliff:g id="DAYS">%1$s</xliff:g> og <xliff:g id="MINUTES">%3$s</xliff:g>."</item>
+    <item msgid="3663661342600168814">"Alarmen ringer om <xliff:g id="HOURS">%2$s</xliff:g> og <xliff:g id="MINUTES">%3$s</xliff:g>."</item>
+    <item msgid="7779544127785487304">"Alarmen ringer om <xliff:g id="DAYS">%1$s</xliff:g>, <xliff:g id="HOURS">%2$s</xliff:g> og <xliff:g id="MINUTES">%3$s</xliff:g>."</item>
+  </string-array>
     <string name="day" msgid="7984755014526510295">"1 dag"</string>
     <string name="days" msgid="2070509222727852210">"<xliff:g id="DAYS">%s</xliff:g> dager"</string>
     <string name="hour" msgid="2546819039651509323">"1 time"</string>
@@ -53,10 +54,45 @@
     <string name="never" msgid="54104287800571769">"Aldri"</string>
     <string name="day_concat" msgid="971998564991636532">", "</string>
     <string name="clock_instructions" msgid="3118560284915857690">"Velg klokken som skal vises."</string>
-    <string name="error" msgid="108628064084462722">"Alarm ikke satt"</string>
-    <string name="dberror" msgid="6922426026866330853">"Beklager, kan ikke sette alarmen."</string>
     <string name="analog_gadget" msgid="1670505720837152766">"Analog klokke"</string>
     <string name="settings" msgid="5849739030579520686">"Innstillinger"</string>
     <string name="alarm_in_silent_mode_title" msgid="3892612644543516705">"Alarm i stillemodus"</string>
     <string name="alarm_in_silent_mode_summary" msgid="6042500263899922832">"Spill alarm selv når telefonen er i stillemodus"</string>
+    <string name="snooze_duration_title" msgid="1471249885139952670">"Slumrevarighet"</string>
+  <string-array name="snooze_duration_entries">
+    <item msgid="8337408933053603125">"5 minutter"</item>
+    <item msgid="5294206441496024610">"10 minutter"</item>
+    <item msgid="2165904039211935470">"15 minutter"</item>
+    <item msgid="7248236967714374250">"20 minutter"</item>
+    <item msgid="738394723625179423">"25 minutter"</item>
+    <item msgid="1180222611308391616">"30 minutter"</item>
+  </string-array>
+  <string-array name="snooze_duration_values">
+    <item msgid="3655014754453084122">"5"</item>
+    <item msgid="8939029597449573449">"10"</item>
+    <item msgid="3922647341176353315">"15"</item>
+    <item msgid="5821804105985044459">"20"</item>
+    <item msgid="6048861883552402852">"25"</item>
+    <item msgid="2740866721232379791">"30"</item>
+  </string-array>
+    <string name="done" msgid="6509722361933858451">"OK"</string>
+    <string name="revert" msgid="9100911171235162926">"Tilbakestill"</string>
+    <string name="alarm_volume_title" msgid="8506245173912428522">"Alarmvolum"</string>
+    <string name="alarm_volume_summary" msgid="8957440373896242438">"Still inn volumet på alarmer"</string>
+    <string name="silent_alarm_summary" msgid="8605302849408279221">"Stille"</string>
+    <string name="alarm_notify_text" msgid="4146350965933990093">"Velg å slumre eller slå av alarmen"</string>
+    <string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (slumre)"</string>
+    <string name="alarm_notify_snooze_text" msgid="8004830999152609519">"Alarmen er innstilt på <xliff:g id="TIME">%s</xliff:g>. Velg for å avbryte."</string>
+    <string name="volume_button_setting_title" msgid="1892885285888644234">"Sideknappfunksjon"</string>
+    <string name="volume_button_setting_summary" msgid="1594641247799573198">"Angi hvilken funksjon du vil at sideknappene skal ha når de trykkes på under en alarm"</string>
+  <string-array name="volume_button_setting_entries">
+    <item msgid="4520420953175098625">"Ingen"</item>
+    <item msgid="7111908302622811168">"Slumre"</item>
+    <item msgid="8573552194573068996">"Slå av"</item>
+  </string-array>
+  <string-array name="volume_button_setting_values">
+    <item msgid="4851033050639608752">"0"</item>
+    <item msgid="3204893476515513084">"1"</item>
+    <item msgid="7687709558968154577">"2"</item>
+  </string-array>
 </resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index fe34182..b691317 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -18,23 +18,22 @@
     <string name="app_label" msgid="6642875149600019623">"Wekker"</string>
     <string name="add_alarm" msgid="5976616107390962899">"Alarm toevoegen"</string>
     <string name="delete_alarm" msgid="3457780990646206817">"Alarm verwijderen"</string>
+    <string name="enable_alarm" msgid="7442658245797418741">"Alarm inschakelen"</string>
+    <string name="disable_alarm" msgid="6665528499886549648">"Alarm uitschakelen"</string>
     <string name="delete_alarm_confirm" msgid="4237696873219106907">"Dit alarm wordt verwijderd."</string>
     <string name="show_clock" msgid="8358759982675616915">"Klok weergeven"</string>
     <string name="hide_clock" msgid="3217727306480505694">"Klok verbergen"</string>
     <string name="label" msgid="162189613902857319">"Label"</string>
     <string name="default_label" msgid="5590025289805630372">"Alarm"</string>
     <string name="set_alarm" msgid="9148359866152726808">"Alarm instellen"</string>
-    <string name="enable" msgid="3089255608289797715">"Alarm inschakelen"</string>
     <string name="alarm_vibrate" msgid="3476686921490362230">"Trillen"</string>
     <string name="alarm_repeat" msgid="7242985466344233206">"Herhalen"</string>
     <string name="alert" msgid="6539852766423700221">"Beltoon"</string>
     <string name="time" msgid="8067216534232296518">"Tijd"</string>
-    <string name="alert_title" msgid="1600112166027371802">"Alarm"</string>
     <string name="alarm_alert_dismiss_text" msgid="4942914605480888820">"Negeren"</string>
     <string name="alarm_alert_alert_silenced" msgid="7918075929961104202">"Alarm gaat uit na <xliff:g id="MINUTES">%d</xliff:g> minuten"</string>
     <string name="alarm_alert_snooze_text" msgid="1774416052207651584">"Snooze"</string>
     <string name="alarm_alert_snooze_set" msgid="656470966696912087">"Snooze is ingesteld op <xliff:g id="MINUTES">%d</xliff:g> minuten."</string>
-    <string name="alarm_alert_snooze_not_set" msgid="8783980489802220546">"Snooze is niet ingesteld - volgende alarm is ingesteld op <xliff:g id="TIME">%s</xliff:g>"</string>
   <string-array name="alarm_set">
     <item msgid="5163476010406761625">"Dit alarm is ingesteld voor minder dan 1 minuut vanaf nu."</item>
     <item msgid="7110525731259629055">"Dit alarm is ingesteld voor <xliff:g id="DAYS">%1$s</xliff:g> vanaf nu."</item>
@@ -55,10 +54,45 @@
     <string name="never" msgid="54104287800571769">"Nooit"</string>
     <string name="day_concat" msgid="971998564991636532">", "</string>
     <string name="clock_instructions" msgid="3118560284915857690">"Selecteer een klok die u wilt weergeven."</string>
-    <string name="error" msgid="108628064084462722">"Alarm is niet ingesteld"</string>
-    <string name="dberror" msgid="6922426026866330853">"Het alarm kan niet worden ingesteld."</string>
     <string name="analog_gadget" msgid="1670505720837152766">"Analoge klok"</string>
     <string name="settings" msgid="5849739030579520686">"Instellingen"</string>
     <string name="alarm_in_silent_mode_title" msgid="3892612644543516705">"Alarm in stille modus"</string>
     <string name="alarm_in_silent_mode_summary" msgid="6042500263899922832">"Alarm afspelen, zelfs als stille modus van telefoon is geactiveerd"</string>
+    <string name="snooze_duration_title" msgid="1471249885139952670">"Snooze-duur"</string>
+  <string-array name="snooze_duration_entries">
+    <item msgid="8337408933053603125">"5 minuten"</item>
+    <item msgid="5294206441496024610">"10 minuten"</item>
+    <item msgid="2165904039211935470">"15 minuten"</item>
+    <item msgid="7248236967714374250">"20 minuten"</item>
+    <item msgid="738394723625179423">"25 minuten"</item>
+    <item msgid="1180222611308391616">"30 minuten"</item>
+  </string-array>
+  <string-array name="snooze_duration_values">
+    <item msgid="3655014754453084122">"5"</item>
+    <item msgid="8939029597449573449">"10"</item>
+    <item msgid="3922647341176353315">"15"</item>
+    <item msgid="5821804105985044459">"20"</item>
+    <item msgid="6048861883552402852">"25"</item>
+    <item msgid="2740866721232379791">"30"</item>
+  </string-array>
+    <string name="done" msgid="6509722361933858451">"Gereed"</string>
+    <string name="revert" msgid="9100911171235162926">"Terugzetten"</string>
+    <string name="alarm_volume_title" msgid="8506245173912428522">"Alarmvolume"</string>
+    <string name="alarm_volume_summary" msgid="8957440373896242438">"Het volume van alarmen instellen"</string>
+    <string name="silent_alarm_summary" msgid="8605302849408279221">"Stil"</string>
+    <string name="alarm_notify_text" msgid="4146350965933990093">"Selecteer of u snooze wilt selecteren voor dit alarm of het alarm wilt negeren."</string>
+    <string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (snooze aan)"</string>
+    <string name="alarm_notify_snooze_text" msgid="8004830999152609519">"Alarm is ingesteld voor <xliff:g id="TIME">%s</xliff:g>. Selecteer om te annuleren."</string>
+    <string name="volume_button_setting_title" msgid="1892885285888644234">"Gedrag van zijknop"</string>
+    <string name="volume_button_setting_summary" msgid="1594641247799573198">"Stel het gewenste gedrag van de zijknoppen in wanneer hierop wordt gedrukt tijdens een alarm"</string>
+  <string-array name="volume_button_setting_entries">
+    <item msgid="4520420953175098625">"Geen"</item>
+    <item msgid="7111908302622811168">"Snooze"</item>
+    <item msgid="8573552194573068996">"Negeren"</item>
+  </string-array>
+  <string-array name="volume_button_setting_values">
+    <item msgid="4851033050639608752">"0"</item>
+    <item msgid="3204893476515513084">"1"</item>
+    <item msgid="7687709558968154577">"2"</item>
+  </string-array>
 </resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 420e086..cf93b85 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -18,23 +18,22 @@
     <string name="app_label" msgid="6642875149600019623">"Budzik"</string>
     <string name="add_alarm" msgid="5976616107390962899">"Dodaj alarm"</string>
     <string name="delete_alarm" msgid="3457780990646206817">"Usuń alarm"</string>
+    <string name="enable_alarm" msgid="7442658245797418741">"Włącz alarm"</string>
+    <string name="disable_alarm" msgid="6665528499886549648">"Wyłącz alarm"</string>
     <string name="delete_alarm_confirm" msgid="4237696873219106907">"Ten zegar zostanie usunięty."</string>
     <string name="show_clock" msgid="8358759982675616915">"Pokaż zegar"</string>
     <string name="hide_clock" msgid="3217727306480505694">"Ukryj zegar"</string>
     <string name="label" msgid="162189613902857319">"Etykieta"</string>
     <string name="default_label" msgid="5590025289805630372">"Alarm"</string>
     <string name="set_alarm" msgid="9148359866152726808">"Ustaw alarm"</string>
-    <string name="enable" msgid="3089255608289797715">"Włącz alarm"</string>
     <string name="alarm_vibrate" msgid="3476686921490362230">"Wibracje"</string>
     <string name="alarm_repeat" msgid="7242985466344233206">"Powtarzanie"</string>
     <string name="alert" msgid="6539852766423700221">"Dzwonek"</string>
     <string name="time" msgid="8067216534232296518">"Godzina"</string>
-    <string name="alert_title" msgid="1600112166027371802">"Alarm"</string>
     <string name="alarm_alert_dismiss_text" msgid="4942914605480888820">"Zamknij"</string>
     <string name="alarm_alert_alert_silenced" msgid="7918075929961104202">"Alarm jest wyciszany po <xliff:g id="MINUTES">%d</xliff:g> min."</string>
     <string name="alarm_alert_snooze_text" msgid="1774416052207651584">"Drzemka"</string>
     <string name="alarm_alert_snooze_set" msgid="656470966696912087">"Drzemka przez <xliff:g id="MINUTES">%d</xliff:g> min."</string>
-    <string name="alarm_alert_snooze_not_set" msgid="8783980489802220546">"Nie ustawiono drzemki – następny alarm: <xliff:g id="TIME">%s</xliff:g>"</string>
   <string-array name="alarm_set">
     <item msgid="5163476010406761625">"Ten alarm włączy się za mniej niż 1 minutę."</item>
     <item msgid="7110525731259629055">"Ten alarm włączy się za <xliff:g id="DAYS">%1$s</xliff:g>."</item>
@@ -55,10 +54,45 @@
     <string name="never" msgid="54104287800571769">"Nigdy"</string>
     <string name="day_concat" msgid="971998564991636532">", "</string>
     <string name="clock_instructions" msgid="3118560284915857690">"Wybierz wyświetlany zegar."</string>
-    <string name="error" msgid="108628064084462722">"Alarm nieustawiony"</string>
-    <string name="dberror" msgid="6922426026866330853">"Niestety, nie można ustawić alarmu."</string>
     <string name="analog_gadget" msgid="1670505720837152766">"Zegar analogowy"</string>
     <string name="settings" msgid="5849739030579520686">"Ustawienia"</string>
     <string name="alarm_in_silent_mode_title" msgid="3892612644543516705">"Alarm w trybie cichym"</string>
     <string name="alarm_in_silent_mode_summary" msgid="6042500263899922832">"Odtwórz alarm, nawet gdy telefon jest w trybie cichym"</string>
+    <string name="snooze_duration_title" msgid="1471249885139952670">"Czas uśpienia"</string>
+  <string-array name="snooze_duration_entries">
+    <item msgid="8337408933053603125">"5 minut"</item>
+    <item msgid="5294206441496024610">"10 minut"</item>
+    <item msgid="2165904039211935470">"15 minut"</item>
+    <item msgid="7248236967714374250">"20 minut"</item>
+    <item msgid="738394723625179423">"25 minut"</item>
+    <item msgid="1180222611308391616">"30 minut"</item>
+  </string-array>
+  <string-array name="snooze_duration_values">
+    <item msgid="3655014754453084122">"5"</item>
+    <item msgid="8939029597449573449">"10"</item>
+    <item msgid="3922647341176353315">"15"</item>
+    <item msgid="5821804105985044459">"20"</item>
+    <item msgid="6048861883552402852">"25"</item>
+    <item msgid="2740866721232379791">"30"</item>
+  </string-array>
+    <string name="done" msgid="6509722361933858451">"Gotowe"</string>
+    <string name="revert" msgid="9100911171235162926">"Przywróć"</string>
+    <string name="alarm_volume_title" msgid="8506245173912428522">"Głośność alarmu"</string>
+    <string name="alarm_volume_summary" msgid="8957440373896242438">"Ustaw głośność alarmów"</string>
+    <string name="silent_alarm_summary" msgid="8605302849408279221">"Cichy"</string>
+    <string name="alarm_notify_text" msgid="4146350965933990093">"Wybierz, czy uśpić, czy też zamknąć ten alarm."</string>
+    <string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (uśpiony)"</string>
+    <string name="alarm_notify_snooze_text" msgid="8004830999152609519">"Alarm ustawiony na godzinę <xliff:g id="TIME">%s</xliff:g>. Wybierz, aby anulować."</string>
+    <string name="volume_button_setting_title" msgid="1892885285888644234">"Działanie bocznego przycisku"</string>
+    <string name="volume_button_setting_summary" msgid="1594641247799573198">"Ustaw żądane działanie bocznych przycisków przy naciśnięciu podczas alarmu"</string>
+  <string-array name="volume_button_setting_entries">
+    <item msgid="4520420953175098625">"Brak"</item>
+    <item msgid="7111908302622811168">"Uśpij"</item>
+    <item msgid="8573552194573068996">"Zamknij"</item>
+  </string-array>
+  <string-array name="volume_button_setting_values">
+    <item msgid="4851033050639608752">"0"</item>
+    <item msgid="3204893476515513084">"1"</item>
+    <item msgid="7687709558968154577">"2"</item>
+  </string-array>
 </resources>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 75c91db..82b1d7e 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -18,31 +18,32 @@
     <string name="app_label" msgid="6642875149600019623">"Despertador"</string>
     <string name="add_alarm" msgid="5976616107390962899">"Adicionar alarme"</string>
     <string name="delete_alarm" msgid="3457780990646206817">"Eliminar alarme"</string>
+    <string name="enable_alarm" msgid="7442658245797418741">"Activar alarme"</string>
+    <string name="disable_alarm" msgid="6665528499886549648">"Desactivar alarme"</string>
     <string name="delete_alarm_confirm" msgid="4237696873219106907">"Este alarme será eliminado."</string>
     <string name="show_clock" msgid="8358759982675616915">"Mostrar relógio"</string>
     <string name="hide_clock" msgid="3217727306480505694">"Ocultar relógio"</string>
     <string name="label" msgid="162189613902857319">"Etiqueta"</string>
     <string name="default_label" msgid="5590025289805630372">"Alarme"</string>
     <string name="set_alarm" msgid="9148359866152726808">"Definir alarme"</string>
-    <string name="enable" msgid="3089255608289797715">"Activar alarme"</string>
     <string name="alarm_vibrate" msgid="3476686921490362230">"Vibrar"</string>
     <string name="alarm_repeat" msgid="7242985466344233206">"Repetir"</string>
     <string name="alert" msgid="6539852766423700221">"Toque"</string>
     <string name="time" msgid="8067216534232296518">"Hora"</string>
-    <string name="alert_title" msgid="1600112166027371802">"Alarme"</string>
     <string name="alarm_alert_dismiss_text" msgid="4942914605480888820">"Ignorar"</string>
     <string name="alarm_alert_alert_silenced" msgid="7918075929961104202">"Alarme silenciado após <xliff:g id="MINUTES">%d</xliff:g> minutos."</string>
     <string name="alarm_alert_snooze_text" msgid="1774416052207651584">"Suspender"</string>
     <string name="alarm_alert_snooze_set" msgid="656470966696912087">"Suspenso por <xliff:g id="MINUTES">%d</xliff:g> minutos."</string>
-    <string name="alarm_alert_snooze_not_set" msgid="8783980489802220546">"Suspensão não definida - próximo alarme definido para as <xliff:g id="TIME">%s</xliff:g>"</string>
-    <!-- no translation found for alarm_set:0 (5163476010406761625) -->
-    <!-- no translation found for alarm_set:1 (7110525731259629055) -->
-    <!-- no translation found for alarm_set:2 (7003982794086186185) -->
-    <!-- no translation found for alarm_set:3 (7311021123230077742) -->
-    <!-- no translation found for alarm_set:4 (8431715191823114872) -->
-    <!-- no translation found for alarm_set:5 (3244151088673185428) -->
-    <!-- no translation found for alarm_set:6 (3663661342600168814) -->
-    <!-- no translation found for alarm_set:7 (7779544127785487304) -->
+  <string-array name="alarm_set">
+    <item msgid="5163476010406761625">"Este alarme dispara daqui a menos de um minuto."</item>
+    <item msgid="7110525731259629055">"Este alarme dispara daqui a <xliff:g id="DAYS">%1$s</xliff:g>."</item>
+    <item msgid="7003982794086186185">"Este alarme dispara daqui a <xliff:g id="HOURS">%2$s</xliff:g>."</item>
+    <item msgid="7311021123230077742">"Este alarme dispara daqui a <xliff:g id="DAYS">%1$s</xliff:g> e <xliff:g id="HOURS">%2$s</xliff:g>."</item>
+    <item msgid="8431715191823114872">"Este alarme dispara daqui a <xliff:g id="MINUTES">%3$s</xliff:g>."</item>
+    <item msgid="3244151088673185428">"Este alarme dispara daqui a <xliff:g id="DAYS">%1$s</xliff:g> e <xliff:g id="MINUTES">%3$s</xliff:g>."</item>
+    <item msgid="3663661342600168814">"Este alarme dispara daqui a <xliff:g id="HOURS">%2$s</xliff:g> e <xliff:g id="MINUTES">%3$s</xliff:g>."</item>
+    <item msgid="7779544127785487304">"Este alarme dispara daqui a <xliff:g id="DAYS">%1$s</xliff:g>, <xliff:g id="HOURS">%2$s</xliff:g> e <xliff:g id="MINUTES">%3$s</xliff:g>."</item>
+  </string-array>
     <string name="day" msgid="7984755014526510295">"1 dia"</string>
     <string name="days" msgid="2070509222727852210">"<xliff:g id="DAYS">%s</xliff:g> dias"</string>
     <string name="hour" msgid="2546819039651509323">"1 hora"</string>
@@ -53,10 +54,45 @@
     <string name="never" msgid="54104287800571769">"Nunca"</string>
     <string name="day_concat" msgid="971998564991636532">", "</string>
     <string name="clock_instructions" msgid="3118560284915857690">"Seleccione um relógio para visualizar."</string>
-    <string name="error" msgid="108628064084462722">"Alarme não definido"</string>
-    <string name="dberror" msgid="6922426026866330853">"Lamentamos, mas não foi possível definir o alarme."</string>
     <string name="analog_gadget" msgid="1670505720837152766">"Relógio analógico"</string>
     <string name="settings" msgid="5849739030579520686">"Definições"</string>
     <string name="alarm_in_silent_mode_title" msgid="3892612644543516705">"Alarme em modo silencioso"</string>
     <string name="alarm_in_silent_mode_summary" msgid="6042500263899922832">"Fazer soar o alarme mesmo com o telefone em modo silencioso"</string>
+    <string name="snooze_duration_title" msgid="1471249885139952670">"Duração da suspensão"</string>
+  <string-array name="snooze_duration_entries">
+    <item msgid="8337408933053603125">"5 minutos"</item>
+    <item msgid="5294206441496024610">"10 minutos"</item>
+    <item msgid="2165904039211935470">"15 minutos"</item>
+    <item msgid="7248236967714374250">"20 minutos"</item>
+    <item msgid="738394723625179423">"25 minutos"</item>
+    <item msgid="1180222611308391616">"30 minutos"</item>
+  </string-array>
+  <string-array name="snooze_duration_values">
+    <item msgid="3655014754453084122">"5"</item>
+    <item msgid="8939029597449573449">"10"</item>
+    <item msgid="3922647341176353315">"15"</item>
+    <item msgid="5821804105985044459">"20"</item>
+    <item msgid="6048861883552402852">"25"</item>
+    <item msgid="2740866721232379791">"30"</item>
+  </string-array>
+    <string name="done" msgid="6509722361933858451">"Concluído"</string>
+    <string name="revert" msgid="9100911171235162926">"Reverter"</string>
+    <string name="alarm_volume_title" msgid="8506245173912428522">"Volume do alarme"</string>
+    <string name="alarm_volume_summary" msgid="8957440373896242438">"Definir o volume dos alarmes"</string>
+    <string name="silent_alarm_summary" msgid="8605302849408279221">"Silencioso"</string>
+    <string name="alarm_notify_text" msgid="4146350965933990093">"Seleccionar suspender ou ignorar este alarme."</string>
+    <string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (suspenso)"</string>
+    <string name="alarm_notify_snooze_text" msgid="8004830999152609519">"Alarme definido para a(s) <xliff:g id="TIME">%s</xliff:g>. Seleccione para cancelar."</string>
+    <string name="volume_button_setting_title" msgid="1892885285888644234">"Comportamento do botão lateral"</string>
+    <string name="volume_button_setting_summary" msgid="1594641247799573198">"Definir o comportamento pretendido dos botões laterais quando premidos durante um alarme"</string>
+  <string-array name="volume_button_setting_entries">
+    <item msgid="4520420953175098625">"Nenhum"</item>
+    <item msgid="7111908302622811168">"Suspender"</item>
+    <item msgid="8573552194573068996">"Ignorar"</item>
+  </string-array>
+  <string-array name="volume_button_setting_values">
+    <item msgid="4851033050639608752">"0"</item>
+    <item msgid="3204893476515513084">"1"</item>
+    <item msgid="7687709558968154577">"2"</item>
+  </string-array>
 </resources>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index a517dbf..a21cf86 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -18,31 +18,32 @@
     <string name="app_label" msgid="6642875149600019623">"Despertador"</string>
     <string name="add_alarm" msgid="5976616107390962899">"Adicionar alarme"</string>
     <string name="delete_alarm" msgid="3457780990646206817">"Excluir alarme"</string>
+    <string name="enable_alarm" msgid="7442658245797418741">"Ativar alarme"</string>
+    <string name="disable_alarm" msgid="6665528499886549648">"Desativar alarme"</string>
     <string name="delete_alarm_confirm" msgid="4237696873219106907">"Este alarme será excluído."</string>
     <string name="show_clock" msgid="8358759982675616915">"Mostrar relógio"</string>
     <string name="hide_clock" msgid="3217727306480505694">"Ocultar relógio"</string>
     <string name="label" msgid="162189613902857319">"Marcador"</string>
     <string name="default_label" msgid="5590025289805630372">"Alarme"</string>
     <string name="set_alarm" msgid="9148359866152726808">"Definir alarme"</string>
-    <string name="enable" msgid="3089255608289797715">"Ativar o alarme"</string>
     <string name="alarm_vibrate" msgid="3476686921490362230">"Vibrar"</string>
     <string name="alarm_repeat" msgid="7242985466344233206">"Repetir"</string>
     <string name="alert" msgid="6539852766423700221">"Toque"</string>
     <string name="time" msgid="8067216534232296518">"Horário"</string>
-    <string name="alert_title" msgid="1600112166027371802">"Alarme"</string>
     <string name="alarm_alert_dismiss_text" msgid="4942914605480888820">"Encerrar"</string>
     <string name="alarm_alert_alert_silenced" msgid="7918075929961104202">"Alarme silenciado após <xliff:g id="MINUTES">%d</xliff:g> minutos"</string>
     <string name="alarm_alert_snooze_text" msgid="1774416052207651584">"Colocar em modo de espera"</string>
     <string name="alarm_alert_snooze_set" msgid="656470966696912087">"Em espera por <xliff:g id="MINUTES">%d</xliff:g> minutos."</string>
-    <string name="alarm_alert_snooze_not_set" msgid="8783980489802220546">"Modo de espera não definido. Próximo alarme definido para <xliff:g id="TIME">%s</xliff:g>"</string>
-    <!-- no translation found for alarm_set:0 (5163476010406761625) -->
-    <!-- no translation found for alarm_set:1 (7110525731259629055) -->
-    <!-- no translation found for alarm_set:2 (7003982794086186185) -->
-    <!-- no translation found for alarm_set:3 (7311021123230077742) -->
-    <!-- no translation found for alarm_set:4 (8431715191823114872) -->
-    <!-- no translation found for alarm_set:5 (3244151088673185428) -->
-    <!-- no translation found for alarm_set:6 (3663661342600168814) -->
-    <!-- no translation found for alarm_set:7 (7779544127785487304) -->
+  <string-array name="alarm_set">
+    <item msgid="5163476010406761625">"Este alarme está definido para menos de um minuto a partir de agora."</item>
+    <item msgid="7110525731259629055">"Este alarme está definido para <xliff:g id="DAYS">%1$s</xliff:g> a partir de agora."</item>
+    <item msgid="7003982794086186185">"Este alarme está definido para <xliff:g id="HOURS">%2$s</xliff:g> a partir de agora."</item>
+    <item msgid="7311021123230077742">"Este alarme está definido para <xliff:g id="DAYS">%1$s</xliff:g> e <xliff:g id="HOURS">%2$s</xliff:g> a partir de agora."</item>
+    <item msgid="8431715191823114872">"Este alarme está definido para <xliff:g id="MINUTES">%3$s</xliff:g> a partir de agora."</item>
+    <item msgid="3244151088673185428">"Este alarme está definido para <xliff:g id="DAYS">%1$s</xliff:g> e <xliff:g id="MINUTES">%3$s</xliff:g> a partir de agora."</item>
+    <item msgid="3663661342600168814">"Este alarme está definido para <xliff:g id="HOURS">%2$s</xliff:g> e <xliff:g id="MINUTES">%3$s</xliff:g> a partir de agora."</item>
+    <item msgid="7779544127785487304">"Este alarme está definido para <xliff:g id="DAYS">%1$s</xliff:g>, <xliff:g id="HOURS">%2$s</xliff:g> e <xliff:g id="MINUTES">%3$s</xliff:g> a partir de agora."</item>
+  </string-array>
     <string name="day" msgid="7984755014526510295">"1 dia"</string>
     <string name="days" msgid="2070509222727852210">"<xliff:g id="DAYS">%s</xliff:g> dias"</string>
     <string name="hour" msgid="2546819039651509323">"1 hora"</string>
@@ -53,10 +54,45 @@
     <string name="never" msgid="54104287800571769">"Nunca"</string>
     <string name="day_concat" msgid="971998564991636532">", "</string>
     <string name="clock_instructions" msgid="3118560284915857690">"Selecione um relógio para exibir."</string>
-    <string name="error" msgid="108628064084462722">"Alarme não definido"</string>
-    <string name="dberror" msgid="6922426026866330853">"Desculpe, não foi possível definir o alarme."</string>
     <string name="analog_gadget" msgid="1670505720837152766">"Relógio analógico"</string>
     <string name="settings" msgid="5849739030579520686">"Configurações"</string>
-    <string name="alarm_in_silent_mode_title" msgid="3892612644543516705">"Alarme no modo silencioso"</string>
+    <string name="alarm_in_silent_mode_title" msgid="3892612644543516705">"Modo silencioso"</string>
     <string name="alarm_in_silent_mode_summary" msgid="6042500263899922832">"Tocar o alarme mesmo quando o telefone estiver no modo silencioso"</string>
+    <string name="snooze_duration_title" msgid="1471249885139952670">"Duração do modo de espera"</string>
+  <string-array name="snooze_duration_entries">
+    <item msgid="8337408933053603125">"5 minutos"</item>
+    <item msgid="5294206441496024610">"10 minutos"</item>
+    <item msgid="2165904039211935470">"15 minutos"</item>
+    <item msgid="7248236967714374250">"20 minutos"</item>
+    <item msgid="738394723625179423">"25 minutos"</item>
+    <item msgid="1180222611308391616">"30 minutos"</item>
+  </string-array>
+  <string-array name="snooze_duration_values">
+    <item msgid="3655014754453084122">"5"</item>
+    <item msgid="8939029597449573449">"10"</item>
+    <item msgid="3922647341176353315">"15"</item>
+    <item msgid="5821804105985044459">"20"</item>
+    <item msgid="6048861883552402852">"25"</item>
+    <item msgid="2740866721232379791">"30"</item>
+  </string-array>
+    <string name="done" msgid="6509722361933858451">"Concluído"</string>
+    <string name="revert" msgid="9100911171235162926">"Reverter"</string>
+    <string name="alarm_volume_title" msgid="8506245173912428522">"Volume do alarme"</string>
+    <string name="alarm_volume_summary" msgid="8957440373896242438">"Definir o volume dos alarmes"</string>
+    <string name="silent_alarm_summary" msgid="8605302849408279221">"Silencioso"</string>
+    <string name="alarm_notify_text" msgid="4146350965933990093">"Selecione para colocar esse alarme em modo de espera ou descartá-lo."</string>
+    <string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (em modo de espera)"</string>
+    <string name="alarm_notify_snooze_text" msgid="8004830999152609519">"Alarme definido para <xliff:g id="TIME">%s</xliff:g>. Selecione para cancelar."</string>
+    <string name="volume_button_setting_title" msgid="1892885285888644234">"Comportamento do botão lateral"</string>
+    <string name="volume_button_setting_summary" msgid="1594641247799573198">"Defina o comportamento desejado dos botões laterais quando pressionados durante um alarme"</string>
+  <string-array name="volume_button_setting_entries">
+    <item msgid="4520420953175098625">"Nenhuma"</item>
+    <item msgid="7111908302622811168">"Colocar em modo de espera"</item>
+    <item msgid="8573552194573068996">"Descartar"</item>
+  </string-array>
+  <string-array name="volume_button_setting_values">
+    <item msgid="4851033050639608752">"0"</item>
+    <item msgid="3204893476515513084">"1"</item>
+    <item msgid="7687709558968154577">"2"</item>
+  </string-array>
 </resources>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 2ce4e2b..14a7810 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -18,31 +18,32 @@
     <string name="app_label" msgid="6642875149600019623">"Будильник"</string>
     <string name="add_alarm" msgid="5976616107390962899">"Добавить будильник"</string>
     <string name="delete_alarm" msgid="3457780990646206817">"Удалить будильник"</string>
+    <string name="enable_alarm" msgid="7442658245797418741">"Включить будильник"</string>
+    <string name="disable_alarm" msgid="6665528499886549648">"Отключить будильник"</string>
     <string name="delete_alarm_confirm" msgid="4237696873219106907">"Сигнал будет удален."</string>
     <string name="show_clock" msgid="8358759982675616915">"Показать часы"</string>
     <string name="hide_clock" msgid="3217727306480505694">"Спрятать часы"</string>
     <string name="label" msgid="162189613902857319">"Ярлык"</string>
     <string name="default_label" msgid="5590025289805630372">"Будильник"</string>
     <string name="set_alarm" msgid="9148359866152726808">"Установить будильник"</string>
-    <string name="enable" msgid="3089255608289797715">"Включить будильник"</string>
     <string name="alarm_vibrate" msgid="3476686921490362230">"Вибрация"</string>
     <string name="alarm_repeat" msgid="7242985466344233206">"Повтор"</string>
     <string name="alert" msgid="6539852766423700221">"Мелодия"</string>
     <string name="time" msgid="8067216534232296518">"Время"</string>
-    <string name="alert_title" msgid="1600112166027371802">"Будильник"</string>
     <string name="alarm_alert_dismiss_text" msgid="4942914605480888820">"Игнорировать"</string>
     <string name="alarm_alert_alert_silenced" msgid="7918075929961104202">"Будильник выключился спустя <xliff:g id="MINUTES">%d</xliff:g> мин."</string>
     <string name="alarm_alert_snooze_text" msgid="1774416052207651584">"Спящий режим"</string>
     <string name="alarm_alert_snooze_set" msgid="656470966696912087">"Отсрочка будильника на <xliff:g id="MINUTES">%d</xliff:g> мин."</string>
-    <string name="alarm_alert_snooze_not_set" msgid="8783980489802220546">"Отсрочка будильника не установлена – следующий сигнал прозвучит в <xliff:g id="TIME">%s</xliff:g>"</string>
-    <!-- no translation found for alarm_set:0 (5163476010406761625) -->
-    <!-- no translation found for alarm_set:1 (7110525731259629055) -->
-    <!-- no translation found for alarm_set:2 (7003982794086186185) -->
-    <!-- no translation found for alarm_set:3 (7311021123230077742) -->
-    <!-- no translation found for alarm_set:4 (8431715191823114872) -->
-    <!-- no translation found for alarm_set:5 (3244151088673185428) -->
-    <!-- no translation found for alarm_set:6 (3663661342600168814) -->
-    <!-- no translation found for alarm_set:7 (7779544127785487304) -->
+  <string-array name="alarm_set">
+    <item msgid="5163476010406761625">"До срабатывания будильника осталось меньше одной минуты."</item>
+    <item msgid="7110525731259629055">"Будильник зазвонит через <xliff:g id="DAYS">%1$s</xliff:g>."</item>
+    <item msgid="7003982794086186185">"Будильник зазвонит через <xliff:g id="HOURS">%2$s</xliff:g>."</item>
+    <item msgid="7311021123230077742">"Будильник зазвонит через <xliff:g id="DAYS">%1$s</xliff:g> и <xliff:g id="HOURS">%2$s</xliff:g>."</item>
+    <item msgid="8431715191823114872">"Будильник зазвонит через <xliff:g id="MINUTES">%3$s</xliff:g>."</item>
+    <item msgid="3244151088673185428">"Будильник зазвонит через <xliff:g id="DAYS">%1$s</xliff:g> и <xliff:g id="MINUTES">%3$s</xliff:g>."</item>
+    <item msgid="3663661342600168814">"Будильник зазвонит через <xliff:g id="HOURS">%2$s</xliff:g> <xliff:g id="MINUTES">%3$s</xliff:g>."</item>
+    <item msgid="7779544127785487304">"Будильник зазвонит через <xliff:g id="DAYS">%1$s</xliff:g>, <xliff:g id="HOURS">%2$s</xliff:g> и <xliff:g id="MINUTES">%3$s</xliff:g>."</item>
+  </string-array>
     <string name="day" msgid="7984755014526510295">"1 день"</string>
     <string name="days" msgid="2070509222727852210">"<xliff:g id="DAYS">%s</xliff:g> дн."</string>
     <string name="hour" msgid="2546819039651509323">"1 час"</string>
@@ -53,10 +54,45 @@
     <string name="never" msgid="54104287800571769">"Никогда"</string>
     <string name="day_concat" msgid="971998564991636532">", "</string>
     <string name="clock_instructions" msgid="3118560284915857690">"Выберите вид часов."</string>
-    <string name="error" msgid="108628064084462722">"Будильник не установлен"</string>
-    <string name="dberror" msgid="6922426026866330853">"К сожалению, будильник не удалось установить."</string>
     <string name="analog_gadget" msgid="1670505720837152766">"Часы со стрелками"</string>
     <string name="settings" msgid="5849739030579520686">"Настройки"</string>
     <string name="alarm_in_silent_mode_title" msgid="3892612644543516705">"Будильник в тихом режиме"</string>
     <string name="alarm_in_silent_mode_summary" msgid="6042500263899922832">"Подавать сигнал, даже если телефон работает в тихом режиме"</string>
+    <string name="snooze_duration_title" msgid="1471249885139952670">"Продолжительность спящего режима"</string>
+  <string-array name="snooze_duration_entries">
+    <item msgid="8337408933053603125">"5 минут"</item>
+    <item msgid="5294206441496024610">"10 минут"</item>
+    <item msgid="2165904039211935470">"15 минут"</item>
+    <item msgid="7248236967714374250">"20 минут"</item>
+    <item msgid="738394723625179423">"25 минут"</item>
+    <item msgid="1180222611308391616">"30 минут"</item>
+  </string-array>
+  <string-array name="snooze_duration_values">
+    <item msgid="3655014754453084122">"5"</item>
+    <item msgid="8939029597449573449">"10"</item>
+    <item msgid="3922647341176353315">"15"</item>
+    <item msgid="5821804105985044459">"20"</item>
+    <item msgid="6048861883552402852">"25"</item>
+    <item msgid="2740866721232379791">"30"</item>
+  </string-array>
+    <string name="done" msgid="6509722361933858451">"Готово"</string>
+    <string name="revert" msgid="9100911171235162926">"Отменить изменения"</string>
+    <string name="alarm_volume_title" msgid="8506245173912428522">"Громкость будильника"</string>
+    <string name="alarm_volume_summary" msgid="8957440373896242438">"Настройка громкости будильника"</string>
+    <string name="silent_alarm_summary" msgid="8605302849408279221">"Без звука"</string>
+    <string name="alarm_notify_text" msgid="4146350965933990093">"Выберите, чтобы включить спящий режим или полностью отключить этот будильник."</string>
+    <string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (спящий режим)"</string>
+    <string name="alarm_notify_snooze_text" msgid="8004830999152609519">"Будильник зазвонит в <xliff:g id="TIME">%s</xliff:g>. Отменить?"</string>
+    <string name="volume_button_setting_title" msgid="1892885285888644234">"Функции боковой кнопки"</string>
+    <string name="volume_button_setting_summary" msgid="1594641247799573198">"Настройка функции боковой кнопки при ее нажатии во время звонка будильника"</string>
+  <string-array name="volume_button_setting_entries">
+    <item msgid="4520420953175098625">"Нет"</item>
+    <item msgid="7111908302622811168">"Спящий режим"</item>
+    <item msgid="8573552194573068996">"Отключить"</item>
+  </string-array>
+  <string-array name="volume_button_setting_values">
+    <item msgid="4851033050639608752">"0"</item>
+    <item msgid="3204893476515513084">"1"</item>
+    <item msgid="7687709558968154577">"2"</item>
+  </string-array>
 </resources>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 1105b2d..260a3bb 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -18,31 +18,32 @@
     <string name="app_label" msgid="6642875149600019623">"Alarm"</string>
     <string name="add_alarm" msgid="5976616107390962899">"Lägg till alarm"</string>
     <string name="delete_alarm" msgid="3457780990646206817">"Ta bort alarm"</string>
+    <string name="enable_alarm" msgid="7442658245797418741">"Aktivera alarmet"</string>
+    <string name="disable_alarm" msgid="6665528499886549648">"Inaktivera alarmet"</string>
     <string name="delete_alarm_confirm" msgid="4237696873219106907">"Alarmet tas bort."</string>
     <string name="show_clock" msgid="8358759982675616915">"Visa klocka"</string>
     <string name="hide_clock" msgid="3217727306480505694">"Dölj klocka"</string>
     <string name="label" msgid="162189613902857319">"Etikett"</string>
     <string name="default_label" msgid="5590025289805630372">"Alarm"</string>
     <string name="set_alarm" msgid="9148359866152726808">"Ställ alarm"</string>
-    <string name="enable" msgid="3089255608289797715">"Aktivera alarm"</string>
     <string name="alarm_vibrate" msgid="3476686921490362230">"Vibrera"</string>
     <string name="alarm_repeat" msgid="7242985466344233206">"Upprepa"</string>
     <string name="alert" msgid="6539852766423700221">"Ringsignal"</string>
     <string name="time" msgid="8067216534232296518">"Tid"</string>
-    <string name="alert_title" msgid="1600112166027371802">"Alarm"</string>
     <string name="alarm_alert_dismiss_text" msgid="4942914605480888820">"Ignorera"</string>
     <string name="alarm_alert_alert_silenced" msgid="7918075929961104202">"Alarmet tystnar efter <xliff:g id="MINUTES">%d</xliff:g> minuter"</string>
     <string name="alarm_alert_snooze_text" msgid="1774416052207651584">"Snooze"</string>
     <string name="alarm_alert_snooze_set" msgid="656470966696912087">"Snoozar i <xliff:g id="MINUTES">%d</xliff:g> minuter."</string>
-    <string name="alarm_alert_snooze_not_set" msgid="8783980489802220546">"Ingen snooze – nästa alarm ringer <xliff:g id="TIME">%s</xliff:g>"</string>
-    <!-- no translation found for alarm_set:0 (5163476010406761625) -->
-    <!-- no translation found for alarm_set:1 (7110525731259629055) -->
-    <!-- no translation found for alarm_set:2 (7003982794086186185) -->
-    <!-- no translation found for alarm_set:3 (7311021123230077742) -->
-    <!-- no translation found for alarm_set:4 (8431715191823114872) -->
-    <!-- no translation found for alarm_set:5 (3244151088673185428) -->
-    <!-- no translation found for alarm_set:6 (3663661342600168814) -->
-    <!-- no translation found for alarm_set:7 (7779544127785487304) -->
+  <string-array name="alarm_set">
+    <item msgid="5163476010406761625">"Alarmet ringer om mindre än 1 minut från och med nu."</item>
+    <item msgid="7110525731259629055">"Alarmet ringer om <xliff:g id="DAYS">%1$s</xliff:g> från och med nu."</item>
+    <item msgid="7003982794086186185">"Alarmet ringer om <xliff:g id="HOURS">%2$s</xliff:g> från och med nu."</item>
+    <item msgid="7311021123230077742">"Alarmet ringer om <xliff:g id="DAYS">%1$s</xliff:g> och <xliff:g id="HOURS">%2$s</xliff:g> från och med nu."</item>
+    <item msgid="8431715191823114872">"Alarmet ringer om <xliff:g id="MINUTES">%3$s</xliff:g> från och med nu."</item>
+    <item msgid="3244151088673185428">"Alarmet ringer om <xliff:g id="DAYS">%1$s</xliff:g> och <xliff:g id="MINUTES">%3$s</xliff:g> från och med nu."</item>
+    <item msgid="3663661342600168814">"Alarmet ringer om <xliff:g id="HOURS">%2$s</xliff:g> och <xliff:g id="MINUTES">%3$s</xliff:g> från och med nu."</item>
+    <item msgid="7779544127785487304">"Alarmet ringer om <xliff:g id="DAYS">%1$s</xliff:g>, <xliff:g id="HOURS">%2$s</xliff:g> och <xliff:g id="MINUTES">%3$s</xliff:g> från och med nu."</item>
+  </string-array>
     <string name="day" msgid="7984755014526510295">"1 dag"</string>
     <string name="days" msgid="2070509222727852210">"<xliff:g id="DAYS">%s</xliff:g> dagar"</string>
     <string name="hour" msgid="2546819039651509323">"1 timme"</string>
@@ -53,10 +54,45 @@
     <string name="never" msgid="54104287800571769">"Aldrig"</string>
     <string name="day_concat" msgid="971998564991636532">", "</string>
     <string name="clock_instructions" msgid="3118560284915857690">"Välj vilken klocka du vill visa."</string>
-    <string name="error" msgid="108628064084462722">"Inget alarm har ställts in"</string>
-    <string name="dberror" msgid="6922426026866330853">"Det gick tyvärr inte att ställa alarmet."</string>
     <string name="analog_gadget" msgid="1670505720837152766">"Analog klocka"</string>
     <string name="settings" msgid="5849739030579520686">"Inställningar"</string>
     <string name="alarm_in_silent_mode_title" msgid="3892612644543516705">"Alarm i tyst läge"</string>
     <string name="alarm_in_silent_mode_summary" msgid="6042500263899922832">"Alarm ringer även när telefonen är i tyst läge"</string>
+    <string name="snooze_duration_title" msgid="1471249885139952670">"Längd på snooze"</string>
+  <string-array name="snooze_duration_entries">
+    <item msgid="8337408933053603125">"5 minuter"</item>
+    <item msgid="5294206441496024610">"10 minuter"</item>
+    <item msgid="2165904039211935470">"15 minuter"</item>
+    <item msgid="7248236967714374250">"20 minuter"</item>
+    <item msgid="738394723625179423">"25 minuter"</item>
+    <item msgid="1180222611308391616">"30 minuter"</item>
+  </string-array>
+  <string-array name="snooze_duration_values">
+    <item msgid="3655014754453084122">"5"</item>
+    <item msgid="8939029597449573449">"10"</item>
+    <item msgid="3922647341176353315">"15"</item>
+    <item msgid="5821804105985044459">"20"</item>
+    <item msgid="6048861883552402852">"25"</item>
+    <item msgid="2740866721232379791">"30"</item>
+  </string-array>
+    <string name="done" msgid="6509722361933858451">"Färdig"</string>
+    <string name="revert" msgid="9100911171235162926">"Återgå"</string>
+    <string name="alarm_volume_title" msgid="8506245173912428522">"Alarmvolym"</string>
+    <string name="alarm_volume_summary" msgid="8957440373896242438">"Ställ in volym för alarmen"</string>
+    <string name="silent_alarm_summary" msgid="8605302849408279221">"Tyst"</string>
+    <string name="alarm_notify_text" msgid="4146350965933990093">"Snooza eller ta bort alarmet permanent."</string>
+    <string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (snoozat)"</string>
+    <string name="alarm_notify_snooze_text" msgid="8004830999152609519">"Alarmet ringer <xliff:g id="TIME">%s</xliff:g>. Välj om du vill avbryta."</string>
+    <string name="volume_button_setting_title" msgid="1892885285888644234">"Sidoknappens funktion"</string>
+    <string name="volume_button_setting_summary" msgid="1594641247799573198">"Ange önskad funktion för sidoknapparna om de används under ett alarm"</string>
+  <string-array name="volume_button_setting_entries">
+    <item msgid="4520420953175098625">"Inga"</item>
+    <item msgid="7111908302622811168">"Snooze"</item>
+    <item msgid="8573552194573068996">"Ta bort permanent"</item>
+  </string-array>
+  <string-array name="volume_button_setting_values">
+    <item msgid="4851033050639608752">"0"</item>
+    <item msgid="3204893476515513084">"1"</item>
+    <item msgid="7687709558968154577">"2"</item>
+  </string-array>
 </resources>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 941c38d..e03623d 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -18,31 +18,32 @@
     <string name="app_label" msgid="6642875149600019623">"Çalar Saat"</string>
     <string name="add_alarm" msgid="5976616107390962899">"Alarm ekle"</string>
     <string name="delete_alarm" msgid="3457780990646206817">"Alarmı sil"</string>
+    <string name="enable_alarm" msgid="7442658245797418741">"Alarmı etkinleştir"</string>
+    <string name="disable_alarm" msgid="6665528499886549648">"Alarmı devre dışı bırak"</string>
     <string name="delete_alarm_confirm" msgid="4237696873219106907">"Bu alarm silinecek."</string>
     <string name="show_clock" msgid="8358759982675616915">"Saati göster"</string>
     <string name="hide_clock" msgid="3217727306480505694">"Saati gizle"</string>
     <string name="label" msgid="162189613902857319">"Etiket"</string>
     <string name="default_label" msgid="5590025289805630372">"Alarm"</string>
     <string name="set_alarm" msgid="9148359866152726808">"Alarmı ayarla"</string>
-    <string name="enable" msgid="3089255608289797715">"Alarmı aç"</string>
     <string name="alarm_vibrate" msgid="3476686921490362230">"Titreşim"</string>
     <string name="alarm_repeat" msgid="7242985466344233206">"Tekrarla"</string>
     <string name="alert" msgid="6539852766423700221">"Zil sesi"</string>
     <string name="time" msgid="8067216534232296518">"Saat"</string>
-    <string name="alert_title" msgid="1600112166027371802">"Alarm"</string>
     <string name="alarm_alert_dismiss_text" msgid="4942914605480888820">"Kapat"</string>
     <string name="alarm_alert_alert_silenced" msgid="7918075929961104202">"<xliff:g id="MINUTES">%d</xliff:g> dakika sonra alarm susturuldu"</string>
     <string name="alarm_alert_snooze_text" msgid="1774416052207651584">"Ertele"</string>
     <string name="alarm_alert_snooze_set" msgid="656470966696912087">"<xliff:g id="MINUTES">%d</xliff:g> dakika erteleniyor."</string>
-    <string name="alarm_alert_snooze_not_set" msgid="8783980489802220546">"Erteleme ayarlanamadı. Sonraki alarm <xliff:g id="TIME">%s</xliff:g> olarak ayarlandı"</string>
-    <!-- no translation found for alarm_set:0 (5163476010406761625) -->
-    <!-- no translation found for alarm_set:1 (7110525731259629055) -->
-    <!-- no translation found for alarm_set:2 (7003982794086186185) -->
-    <!-- no translation found for alarm_set:3 (7311021123230077742) -->
-    <!-- no translation found for alarm_set:4 (8431715191823114872) -->
-    <!-- no translation found for alarm_set:5 (3244151088673185428) -->
-    <!-- no translation found for alarm_set:6 (3663661342600168814) -->
-    <!-- no translation found for alarm_set:7 (7779544127785487304) -->
+  <string-array name="alarm_set">
+    <item msgid="5163476010406761625">"Bu alarm, şu andan itibaren bir dakikadan kısa süre içinde çalacaktır."</item>
+    <item msgid="7110525731259629055">"Bu alarmın çalmasına şu andan itibaren <xliff:g id="DAYS">%1$s</xliff:g> var."</item>
+    <item msgid="7003982794086186185">"Bu alarmın çalmasına şu andan itibaren <xliff:g id="HOURS">%2$s</xliff:g> var."</item>
+    <item msgid="7311021123230077742">"Bu alarmın çalmasına şu andan itibaren <xliff:g id="DAYS">%1$s</xliff:g> ve <xliff:g id="HOURS">%2$s</xliff:g> var."</item>
+    <item msgid="8431715191823114872">"Bu alarmın çalmasına şu andan itibaren <xliff:g id="MINUTES">%3$s</xliff:g> var."</item>
+    <item msgid="3244151088673185428">"Bu alarmın çalmasına şu andan itibaren <xliff:g id="DAYS">%1$s</xliff:g> ve <xliff:g id="MINUTES">%3$s</xliff:g> var."</item>
+    <item msgid="3663661342600168814">"Bu alarmın çalmasına şu andan itibaren <xliff:g id="HOURS">%2$s</xliff:g> ve <xliff:g id="MINUTES">%3$s</xliff:g> var."</item>
+    <item msgid="7779544127785487304">"Bu alarmın çalmasına şu andan itibaren <xliff:g id="DAYS">%1$s</xliff:g>, <xliff:g id="HOURS">%2$s</xliff:g> ve <xliff:g id="MINUTES">%3$s</xliff:g> var."</item>
+  </string-array>
     <string name="day" msgid="7984755014526510295">"1 gün"</string>
     <string name="days" msgid="2070509222727852210">"<xliff:g id="DAYS">%s</xliff:g> gün"</string>
     <string name="hour" msgid="2546819039651509323">"1 saat"</string>
@@ -53,10 +54,45 @@
     <string name="never" msgid="54104287800571769">"Asla"</string>
     <string name="day_concat" msgid="971998564991636532">", "</string>
     <string name="clock_instructions" msgid="3118560284915857690">"Görüntülenecek bir saat seçin."</string>
-    <string name="error" msgid="108628064084462722">"Alarm ayarlanmadı"</string>
-    <string name="dberror" msgid="6922426026866330853">"Maalesef, alarm ayarlanamadı."</string>
     <string name="analog_gadget" msgid="1670505720837152766">"Analog saat"</string>
     <string name="settings" msgid="5849739030579520686">"Ayarlar"</string>
     <string name="alarm_in_silent_mode_title" msgid="3892612644543516705">"Sessiz modda alarm çal"</string>
     <string name="alarm_in_silent_mode_summary" msgid="6042500263899922832">"Telefon sessiz moddayken bile alarm çal"</string>
+    <string name="snooze_duration_title" msgid="1471249885139952670">"Erteleme süresi"</string>
+  <string-array name="snooze_duration_entries">
+    <item msgid="8337408933053603125">"5 dakika"</item>
+    <item msgid="5294206441496024610">"10 dakika"</item>
+    <item msgid="2165904039211935470">"15 dakika"</item>
+    <item msgid="7248236967714374250">"20 dakika"</item>
+    <item msgid="738394723625179423">"25 dakika"</item>
+    <item msgid="1180222611308391616">"30 dakika"</item>
+  </string-array>
+  <string-array name="snooze_duration_values">
+    <item msgid="3655014754453084122">"5"</item>
+    <item msgid="8939029597449573449">"10"</item>
+    <item msgid="3922647341176353315">"15"</item>
+    <item msgid="5821804105985044459">"20"</item>
+    <item msgid="6048861883552402852">"25"</item>
+    <item msgid="2740866721232379791">"30"</item>
+  </string-array>
+    <string name="done" msgid="6509722361933858451">"Bitti"</string>
+    <string name="revert" msgid="9100911171235162926">"Geri Döndür"</string>
+    <string name="alarm_volume_title" msgid="8506245173912428522">"Alarm ses düzeyi"</string>
+    <string name="alarm_volume_summary" msgid="8957440373896242438">"Alarmların ses düzeyini ayarla"</string>
+    <string name="silent_alarm_summary" msgid="8605302849408279221">"Sessiz"</string>
+    <string name="alarm_notify_text" msgid="4146350965933990093">"Ertelemek veya alarmı kapatmak için seçin."</string>
+    <string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (ertelendi)"</string>
+    <string name="alarm_notify_snooze_text" msgid="8004830999152609519">"<xliff:g id="TIME">%s</xliff:g> için alarm ayarlandı. İptal etmek için seçin."</string>
+    <string name="volume_button_setting_title" msgid="1892885285888644234">"Yan düğme işlevi"</string>
+    <string name="volume_button_setting_summary" msgid="1594641247799573198">"Alarm sırasında basıldığında yan düğmenin nasıl işlev görmesini istediğinizi ayarlayın"</string>
+  <string-array name="volume_button_setting_entries">
+    <item msgid="4520420953175098625">"Yok"</item>
+    <item msgid="7111908302622811168">"Ertele"</item>
+    <item msgid="8573552194573068996">"Kapat"</item>
+  </string-array>
+  <string-array name="volume_button_setting_values">
+    <item msgid="4851033050639608752">"0"</item>
+    <item msgid="3204893476515513084">"1"</item>
+    <item msgid="7687709558968154577">"2"</item>
+  </string-array>
 </resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index d211553..477ff40 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -18,31 +18,32 @@
     <string name="app_label" msgid="6642875149600019623">"闹钟"</string>
     <string name="add_alarm" msgid="5976616107390962899">"添加闹钟"</string>
     <string name="delete_alarm" msgid="3457780990646206817">"取消闹钟"</string>
+    <string name="enable_alarm" msgid="7442658245797418741">"启用闹钟"</string>
+    <string name="disable_alarm" msgid="6665528499886549648">"停用闹钟"</string>
     <string name="delete_alarm_confirm" msgid="4237696873219106907">"将会取消此闹钟。"</string>
     <string name="show_clock" msgid="8358759982675616915">"显示时钟"</string>
     <string name="hide_clock" msgid="3217727306480505694">"隐藏时钟"</string>
     <string name="label" msgid="162189613902857319">"标签"</string>
     <string name="default_label" msgid="5590025289805630372">"闹钟"</string>
     <string name="set_alarm" msgid="9148359866152726808">"设置闹钟"</string>
-    <string name="enable" msgid="3089255608289797715">"开启闹钟"</string>
     <string name="alarm_vibrate" msgid="3476686921490362230">"振动"</string>
     <string name="alarm_repeat" msgid="7242985466344233206">"重复"</string>
     <string name="alert" msgid="6539852766423700221">"铃声"</string>
     <string name="time" msgid="8067216534232296518">"时间"</string>
-    <string name="alert_title" msgid="1600112166027371802">"闹钟"</string>
     <string name="alarm_alert_dismiss_text" msgid="4942914605480888820">"关闭"</string>
-    <string name="alarm_alert_alert_silenced" msgid="7918075929961104202">"闹钟响铃时间为 <xliff:g id="MINUTES">%d</xliff:g> 分钟"</string>
+    <string name="alarm_alert_alert_silenced" msgid="7918075929961104202">"闹钟提示已过 <xliff:g id="MINUTES">%d</xliff:g> 分钟"</string>
     <string name="alarm_alert_snooze_text" msgid="1774416052207651584">"暂停"</string>
     <string name="alarm_alert_snooze_set" msgid="656470966696912087">"暂停 <xliff:g id="MINUTES">%d</xliff:g> 分钟。"</string>
-    <string name="alarm_alert_snooze_not_set" msgid="8783980489802220546">"无法设置暂停 - 下一个闹钟已设置为在 <xliff:g id="TIME">%s</xliff:g>后提醒"</string>
-    <!-- no translation found for alarm_set:0 (5163476010406761625) -->
-    <!-- no translation found for alarm_set:1 (7110525731259629055) -->
-    <!-- no translation found for alarm_set:2 (7003982794086186185) -->
-    <!-- no translation found for alarm_set:3 (7311021123230077742) -->
-    <!-- no translation found for alarm_set:4 (8431715191823114872) -->
-    <!-- no translation found for alarm_set:5 (3244151088673185428) -->
-    <!-- no translation found for alarm_set:6 (3663661342600168814) -->
-    <!-- no translation found for alarm_set:7 (7779544127785487304) -->
+  <string-array name="alarm_set">
+    <item msgid="5163476010406761625">"已将此闹钟设置为从现在起不到 1 分钟后提醒。"</item>
+    <item msgid="7110525731259629055">"已将此闹钟设置为从现在起 <xliff:g id="DAYS">%1$s</xliff:g>后提醒。"</item>
+    <item msgid="7003982794086186185">"已将此闹钟设置为从现在起 <xliff:g id="HOURS">%2$s</xliff:g>后提醒。"</item>
+    <item msgid="7311021123230077742">"已将此闹钟设置为从现在起 <xliff:g id="DAYS">%1$s</xliff:g> <xliff:g id="HOURS">%2$s</xliff:g>后提醒。"</item>
+    <item msgid="8431715191823114872">"已将此闹钟设置为从现在起 <xliff:g id="MINUTES">%3$s</xliff:g>后提醒。"</item>
+    <item msgid="3244151088673185428">"已将此闹钟设置为从现在起 <xliff:g id="DAYS">%1$s</xliff:g> <xliff:g id="MINUTES">%3$s</xliff:g>后提醒。"</item>
+    <item msgid="3663661342600168814">"已将此闹钟设置为从现在起 <xliff:g id="HOURS">%2$s</xliff:g> <xliff:g id="MINUTES">%3$s</xliff:g>后提醒。"</item>
+    <item msgid="7779544127785487304">"已将该闹钟设置为从现在起 <xliff:g id="DAYS">%1$s</xliff:g> <xliff:g id="HOURS">%2$s</xliff:g> <xliff:g id="MINUTES">%3$s</xliff:g>后提醒。"</item>
+  </string-array>
     <string name="day" msgid="7984755014526510295">"1 天"</string>
     <string name="days" msgid="2070509222727852210">"<xliff:g id="DAYS">%s</xliff:g> 天"</string>
     <string name="hour" msgid="2546819039651509323">"1 小时"</string>
@@ -53,10 +54,45 @@
     <string name="never" msgid="54104287800571769">"永不"</string>
     <string name="day_concat" msgid="971998564991636532">"、 "</string>
     <string name="clock_instructions" msgid="3118560284915857690">"选择要显示的时钟。"</string>
-    <string name="error" msgid="108628064084462722">"未设置闹钟"</string>
-    <string name="dberror" msgid="6922426026866330853">"很抱歉,无法设置闹钟。"</string>
     <string name="analog_gadget" msgid="1670505720837152766">"模拟时钟"</string>
     <string name="settings" msgid="5849739030579520686">"设置"</string>
     <string name="alarm_in_silent_mode_title" msgid="3892612644543516705">"在静音模式下提醒"</string>
     <string name="alarm_in_silent_mode_summary" msgid="6042500263899922832">"当手机处于静音模式时,同样进行提醒"</string>
+    <string name="snooze_duration_title" msgid="1471249885139952670">"暂停时长"</string>
+  <string-array name="snooze_duration_entries">
+    <item msgid="8337408933053603125">"5 分钟"</item>
+    <item msgid="5294206441496024610">"10 分钟"</item>
+    <item msgid="2165904039211935470">"15 分钟"</item>
+    <item msgid="7248236967714374250">"20 分钟"</item>
+    <item msgid="738394723625179423">"25 分钟"</item>
+    <item msgid="1180222611308391616">"30 分钟"</item>
+  </string-array>
+  <string-array name="snooze_duration_values">
+    <item msgid="3655014754453084122">"5"</item>
+    <item msgid="8939029597449573449">"10"</item>
+    <item msgid="3922647341176353315">"15"</item>
+    <item msgid="5821804105985044459">"20"</item>
+    <item msgid="6048861883552402852">"25"</item>
+    <item msgid="2740866721232379791">"30"</item>
+  </string-array>
+    <string name="done" msgid="6509722361933858451">"完成"</string>
+    <string name="revert" msgid="9100911171235162926">"还原"</string>
+    <string name="alarm_volume_title" msgid="8506245173912428522">"闹钟音量"</string>
+    <string name="alarm_volume_summary" msgid="8957440373896242438">"设置闹钟音量"</string>
+    <string name="silent_alarm_summary" msgid="8605302849408279221">"静音"</string>
+    <string name="alarm_notify_text" msgid="4146350965933990093">"选择暂停或关闭此闹钟。"</string>
+    <string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g>(已暂停)"</string>
+    <string name="alarm_notify_snooze_text" msgid="8004830999152609519">"已将闹钟设置为从现在起 <xliff:g id="TIME">%s</xliff:g>后再提醒。选中可以取消。"</string>
+    <string name="volume_button_setting_title" msgid="1892885285888644234">"侧按钮行为"</string>
+    <string name="volume_button_setting_summary" msgid="1594641247799573198">"根据需要设置闹钟响时按侧按钮所期望出现的行为"</string>
+  <string-array name="volume_button_setting_entries">
+    <item msgid="4520420953175098625">"无"</item>
+    <item msgid="7111908302622811168">"暂停"</item>
+    <item msgid="8573552194573068996">"关闭"</item>
+  </string-array>
+  <string-array name="volume_button_setting_values">
+    <item msgid="4851033050639608752">"0"</item>
+    <item msgid="3204893476515513084">"1"</item>
+    <item msgid="7687709558968154577">"2"</item>
+  </string-array>
 </resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 212751c..6f60110 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -18,23 +18,22 @@
     <string name="app_label" msgid="6642875149600019623">"鬧鐘"</string>
     <string name="add_alarm" msgid="5976616107390962899">"新增鬧鐘"</string>
     <string name="delete_alarm" msgid="3457780990646206817">"刪除鬧鐘"</string>
+    <string name="enable_alarm" msgid="7442658245797418741">"啟用鬧鐘"</string>
+    <string name="disable_alarm" msgid="6665528499886549648">"停用鬧鐘"</string>
     <string name="delete_alarm_confirm" msgid="4237696873219106907">"刪除此鬧鐘?"</string>
     <string name="show_clock" msgid="8358759982675616915">"顯示時鐘"</string>
     <string name="hide_clock" msgid="3217727306480505694">"隱藏時鐘"</string>
     <string name="label" msgid="162189613902857319">"標籤"</string>
     <string name="default_label" msgid="5590025289805630372">"鬧鐘"</string>
     <string name="set_alarm" msgid="9148359866152726808">"設定鬧鐘"</string>
-    <string name="enable" msgid="3089255608289797715">"開啟鬧鐘"</string>
     <string name="alarm_vibrate" msgid="3476686921490362230">"震動"</string>
     <string name="alarm_repeat" msgid="7242985466344233206">"重複"</string>
     <string name="alert" msgid="6539852766423700221">"鈴聲"</string>
     <string name="time" msgid="8067216534232296518">"時間"</string>
-    <string name="alert_title" msgid="1600112166027371802">"鬧鐘"</string>
     <string name="alarm_alert_dismiss_text" msgid="4942914605480888820">"關閉"</string>
     <string name="alarm_alert_alert_silenced" msgid="7918075929961104202">"鬧鐘 <xliff:g id="MINUTES">%d</xliff:g> 分鐘後靜音"</string>
     <string name="alarm_alert_snooze_text" msgid="1774416052207651584">"貪睡"</string>
     <string name="alarm_alert_snooze_set" msgid="656470966696912087">"再貪睡 <xliff:g id="MINUTES">%d</xliff:g> 分鐘。"</string>
-    <string name="alarm_alert_snooze_not_set" msgid="8783980489802220546">"未設定貪睡鬧鐘 -- 下一次鬧鐘時間為 <xliff:g id="TIME">%s</xliff:g>"</string>
   <string-array name="alarm_set">
     <item msgid="5163476010406761625">"已將此鬧鐘設為 1 分種後啟動。"</item>
     <item msgid="7110525731259629055">"已將此鬧鐘設為 <xliff:g id="DAYS">%1$s</xliff:g> 天後啟動。"</item>
@@ -55,10 +54,45 @@
     <string name="never" msgid="54104287800571769">"從不"</string>
     <string name="day_concat" msgid="971998564991636532">"、 "</string>
     <string name="clock_instructions" msgid="3118560284915857690">"選取顯示的時鐘。"</string>
-    <string name="error" msgid="108628064084462722">"鬧鐘未設定"</string>
-    <string name="dberror" msgid="6922426026866330853">"很抱歉,無法設定鬧鐘。"</string>
     <string name="analog_gadget" msgid="1670505720837152766">"類比時鐘"</string>
     <string name="settings" msgid="5849739030579520686">"設定"</string>
     <string name="alarm_in_silent_mode_title" msgid="3892612644543516705">"靜音模式下的鬧鐘"</string>
     <string name="alarm_in_silent_mode_summary" msgid="6042500263899922832">"手機處於靜音模式時,鬧鐘仍會響"</string>
+    <string name="snooze_duration_title" msgid="1471249885139952670">"貪睡時間"</string>
+  <string-array name="snooze_duration_entries">
+    <item msgid="8337408933053603125">"5 分鐘"</item>
+    <item msgid="5294206441496024610">"10 分鐘"</item>
+    <item msgid="2165904039211935470">"15 分鐘"</item>
+    <item msgid="7248236967714374250">"20 分鐘"</item>
+    <item msgid="738394723625179423">"25 分鐘"</item>
+    <item msgid="1180222611308391616">"30 分鐘"</item>
+  </string-array>
+  <string-array name="snooze_duration_values">
+    <item msgid="3655014754453084122">"5"</item>
+    <item msgid="8939029597449573449">"10"</item>
+    <item msgid="3922647341176353315">"15"</item>
+    <item msgid="5821804105985044459">"20"</item>
+    <item msgid="6048861883552402852">"25"</item>
+    <item msgid="2740866721232379791">"30"</item>
+  </string-array>
+    <string name="done" msgid="6509722361933858451">"完成"</string>
+    <string name="revert" msgid="9100911171235162926">"復原"</string>
+    <string name="alarm_volume_title" msgid="8506245173912428522">"鬧鐘音量"</string>
+    <string name="alarm_volume_summary" msgid="8957440373896242438">"設定鬧鐘音量"</string>
+    <string name="silent_alarm_summary" msgid="8605302849408279221">"靜音"</string>
+    <string name="alarm_notify_text" msgid="4146350965933990093">"選取貪睡功能或關閉此鬧鐘。"</string>
+    <string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (貪睡)"</string>
+    <string name="alarm_notify_snooze_text" msgid="8004830999152609519">"已將鬧鐘設定在 <xliff:g id="TIME">%s</xliff:g>,選取即可取消。"</string>
+    <string name="volume_button_setting_title" msgid="1892885285888644234">"側邊按鈕功用"</string>
+    <string name="volume_button_setting_summary" msgid="1594641247799573198">"設定側邊按鈕在鬧鐘啟動時的功用"</string>
+  <string-array name="volume_button_setting_entries">
+    <item msgid="4520420953175098625">"無"</item>
+    <item msgid="7111908302622811168">"貪睡"</item>
+    <item msgid="8573552194573068996">"關閉"</item>
+  </string-array>
+  <string-array name="volume_button_setting_values">
+    <item msgid="4851033050639608752">"0"</item>
+    <item msgid="3204893476515513084">"1"</item>
+    <item msgid="7687709558968154577">"2"</item>
+  </string-array>
 </resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index c7033a2..a5207d3 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -25,6 +25,12 @@
     <!-- Context Menu Item on Alarm Settings screen: Delete alarm -->
     <string name="delete_alarm">Delete alarm</string>
 
+    <!-- Context Menu Item on Alarm Settings screen: Enable alarm -->
+    <string name="enable_alarm">Enable alarm</string>
+
+    <!-- Context Menu Item on Alarm Settings screen: Disable alarm -->
+    <string name="disable_alarm">Disable alarm</string>
+
     <!-- Delete alarm confirmation dialog message. -->
     <string name="delete_alarm_confirm">This alarm will be deleted.</string>
 
@@ -43,9 +49,6 @@
     <!-- Preference category on Alarm Settings screen: Set alarm -->
     <string name="set_alarm">Set alarm</string>
 
-    <!-- Setting labels on Set alarm screen: Enable alarm -->
-    <string name="enable">Turn on alarm</string>
-
     <!-- Setting labels on Set alarm screen: Vibration on or off -->
     <string name="alarm_vibrate">Vibrate</string>
 
@@ -58,10 +61,6 @@
     <!-- Setting labels on Set alarm screen: Set time  -->
     <string name="time">Time</string>
 
-
-    <!-- Title of the alarm alert -->
-    <string name="alert_title">Alarm</string>
-    
     <!-- Button labels on the alarm dialog: Dismiss -->
     <string name="alarm_alert_dismiss_text">Dismiss</string>
 
@@ -77,12 +76,6 @@
          dialog. Says the alarm will snooze for xxx minutes.  -->
     <string name="alarm_alert_snooze_set">Snoozing for <xliff:g id="minutes">%d</xliff:g> minutes.</string>
 
-    <!-- Toast that appears after Alarm is snoozed from the Alarm
-         dialog. Shown if snooze cannot be set because the next alarm
-         would fire before the snooze alrm.  "Snooze not set - next
-         alarm set for xxx."  -->
-    <string name="alarm_alert_snooze_not_set">Snooze not set -- next alarm set for <xliff:g id="time">%s</xliff:g></string>
-
     <!-- 0: nothing
          1: days
          2:      hours
@@ -143,14 +136,6 @@
          select a clock to display -->
     <string name="clock_instructions">Select a clock to display.</string>
 
-    <!-- Error dialog title: Alarm not set.  Appears only on critical
-         failure -->
-    <string name="error">Alarm not set</string>
-
-    <!-- Error dialog message.  Appears only on critical
-         failure -->
-    <string name="dberror">Sorry, the alarm could not be set.</string>
-
     <!-- Label for analog clock gadget, shown in list of all gadgets -->
     <string name="analog_gadget">Analog clock</string>
 
@@ -165,6 +150,74 @@
     <!-- Setting summary for whether the alarm should play in silent mode. -->
     <string name="alarm_in_silent_mode_summary">Play alarm even when the phone is in silent mode</string>
 
+    <!-- Setting title for changing the snooze duration. -->
+    <string name="snooze_duration_title">Snooze duration</string>
+
+    <!-- Entries listed in the ListPreference when invoking the snooze duration
+         preference. -->
+    <string-array name="snooze_duration_entries">
+      <item>5 minutes</item>
+      <item>10 minutes</item>
+      <item>15 minutes</item>
+      <item>20 minutes</item>
+      <item>25 minutes</item>
+      <item>30 minutes</item>
+    </string-array>
+
+    <!-- Values that are retrieved from the ListPreference. These must match
+         the snooze_duration_entries above. -->
+    <string-array name="snooze_duration_values">
+      <item>5</item>
+      <item>10</item>
+      <item>15</item>
+      <item>20</item>
+      <item>25</item>
+      <item>30</item>
+    </string-array>
+
+    <!-- Done button when editing an alarm. -->
+    <string name="done">Done</string>
+
+    <!-- Revert button when editing an alarm. -->
+    <string name="revert">Revert</string>
+
+    <!-- Setting title for changing the alarm volume. -->
+    <string name="alarm_volume_title">Alarm volume</string>
+
+    <!-- Setting summary for changing the alarm volume. -->
+    <string name="alarm_volume_summary">Set the volume of alarms</string>
+
+    <!-- Summary for the alarm preference when silent is chosen. -->
+    <string name="silent_alarm_summary">Silent</string>
+
+    <!-- Text to display in the small text of the notification -->
+    <string name="alarm_notify_text">Select to snooze or dismiss this alarm.</string>
+
+    <!-- Text to display in the notification ticker and label -->
+    <string name="alarm_notify_snooze_label"><xliff:g id="label">%s</xliff:g> (snoozed)</string>
+
+    <!-- Text to display in the notification when the alarm has been snoozed -->
+    <string name="alarm_notify_snooze_text">Alarm set for <xliff:g id="time">%s</xliff:g>. Select to cancel.</string>
+
+    <!-- Title of the setting to change the volume/camera button behavior. -->
+    <string name="volume_button_setting_title">Side button behavior</string>
+
+    <!-- The summary of the side button setting. -->
+    <string name="volume_button_setting_summary">Set the desired behavior of the side buttons when pressed during an alarm</string>
+
+    <!-- Entries listed in the setting for the side-button action. -->
+    <string-array name="volume_button_setting_entries">
+      <item>None</item>
+      <item>Snooze</item>
+      <item>Dismiss</item>
+    </string-array>
+
+    <!-- Values for the side-button setting. -->
+    <string-array name="volume_button_setting_values">
+      <item>0</item>
+      <item>1</item>
+      <item>2</item>
+    </string-array>
 </resources>
 
 
diff --git a/res/xml/alarm_prefs.xml b/res/xml/alarm_prefs.xml
index 627bd79..ff672e1 100644
--- a/res/xml/alarm_prefs.xml
+++ b/res/xml/alarm_prefs.xml
@@ -16,22 +16,25 @@
 
 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
         android:title="@string/set_alarm">
-    <CheckBoxPreference android:key="on" 
-        android:title="@string/enable"/>
     <Preference android:key="time" 
+        android:persistent="false"
         android:title="@string/time"/>
     <com.android.alarmclock.AlarmPreference
         android:key="alarm" 
         android:title="@string/alert"
         android:ringtoneType="alarm"
+        android:persistent="false"
         android:showDefault="false"
-        android:showSilent="false" />
+        android:showSilent="true" />
     <CheckBoxPreference android:key="vibrate" 
+        android:persistent="false"
         android:title="@string/alarm_vibrate"/>
     <com.android.alarmclock.RepeatPreference
+        android:persistent="false"
         android:key="setRepeat" 
         android:title="@string/alarm_repeat" />
     <EditTextPreference android:key="label"
+        android:persistent="false"
         android:title="@string/label"
         android:dialogTitle="@string/label" />
 </PreferenceScreen>
diff --git a/res/xml/settings.xml b/res/xml/settings.xml
index 5863e89..e49126c 100644
--- a/res/xml/settings.xml
+++ b/res/xml/settings.xml
@@ -23,4 +23,27 @@
         android:title="@string/alarm_in_silent_mode_title"
         android:summary="@string/alarm_in_silent_mode_summary" />
 
+    <VolumePreference
+        android:title="@string/alarm_volume_title"
+        android:summary="@string/alarm_volume_summary"
+        android:dialogTitle="@string/alarm_volume_title"
+        android:persistent="false"
+        android:streamType="alarm" />
+
+    <ListPreference
+        android:key="snooze_duration"
+        android:title="@string/snooze_duration_title"
+        android:entries="@array/snooze_duration_entries"
+        android:entryValues="@array/snooze_duration_values"
+        android:defaultValue="10"
+        android:dialogTitle="@string/snooze_duration_title" />
+
+    <ListPreference
+        android:key="volume_button_setting"
+        android:title="@string/volume_button_setting_title"
+        android:entries="@array/volume_button_setting_entries"
+        android:entryValues="@array/volume_button_setting_values"
+        android:summary="@string/volume_button_setting_summary"
+        android:defaultValue="2" />
+
 </PreferenceScreen>
diff --git a/src/com/android/alarmclock/Alarm.java b/src/com/android/alarmclock/Alarm.java
new file mode 100644
index 0000000..350b7b4
--- /dev/null
+++ b/src/com/android/alarmclock/Alarm.java
@@ -0,0 +1,341 @@
+/*
+ * 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.alarmclock;
+
+import android.content.Context;
+import android.database.Cursor;
+import android.media.RingtoneManager;
+import android.net.Uri;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.provider.BaseColumns;
+import android.text.format.DateFormat;
+
+import java.text.DateFormatSymbols;
+import java.util.Calendar;
+
+public final class Alarm implements Parcelable {
+
+    //////////////////////////////
+    // Parcelable apis
+    //////////////////////////////
+    public static final Parcelable.Creator<Alarm> CREATOR
+            = new Parcelable.Creator<Alarm>() {
+                public Alarm createFromParcel(Parcel p) {
+                    return new Alarm(p);
+                }
+
+                public Alarm[] newArray(int size) {
+                    return new Alarm[size];
+                }
+            };
+
+    public int describeContents() {
+        return 0;
+    }
+
+    public void writeToParcel(Parcel p, int flags) {
+        p.writeInt(id);
+        p.writeInt(enabled ? 1 : 0);
+        p.writeInt(hour);
+        p.writeInt(minutes);
+        p.writeInt(daysOfWeek.getCoded());
+        p.writeLong(time);
+        p.writeInt(vibrate ? 1 : 0);
+        p.writeString(label);
+        p.writeParcelable(alert, flags);
+        p.writeInt(silent ? 1 : 0);
+    }
+    //////////////////////////////
+    // end Parcelable apis
+    //////////////////////////////
+
+    //////////////////////////////
+    // Column definitions
+    //////////////////////////////
+    public static class Columns implements BaseColumns {
+        /**
+         * The content:// style URL for this table
+         */
+        public static final Uri CONTENT_URI =
+                Uri.parse("content://com.android.alarmclock/alarm");
+
+        /**
+         * Hour in 24-hour localtime 0 - 23.
+         * <P>Type: INTEGER</P>
+         */
+        public static final String HOUR = "hour";
+
+        /**
+         * Minutes in localtime 0 - 59
+         * <P>Type: INTEGER</P>
+         */
+        public static final String MINUTES = "minutes";
+
+        /**
+         * Days of week coded as integer
+         * <P>Type: INTEGER</P>
+         */
+        public static final String DAYS_OF_WEEK = "daysofweek";
+
+        /**
+         * Alarm time in UTC milliseconds from the epoch.
+         * <P>Type: INTEGER</P>
+         */
+        public static final String ALARM_TIME = "alarmtime";
+
+        /**
+         * True if alarm is active
+         * <P>Type: BOOLEAN</P>
+         */
+        public static final String ENABLED = "enabled";
+
+        /**
+         * True if alarm should vibrate
+         * <P>Type: BOOLEAN</P>
+         */
+        public static final String VIBRATE = "vibrate";
+
+        /**
+         * Message to show when alarm triggers
+         * Note: not currently used
+         * <P>Type: STRING</P>
+         */
+        public static final String MESSAGE = "message";
+
+        /**
+         * Audio alert to play when alarm triggers
+         * <P>Type: STRING</P>
+         */
+        public static final String ALERT = "alert";
+
+        /**
+         * The default sort order for this table
+         */
+        public static final String DEFAULT_SORT_ORDER = _ID + " ASC";
+
+        // Used when filtering enabled alarms.
+        public static final String WHERE_ENABLED = ENABLED + "=1";
+
+        static final String[] ALARM_QUERY_COLUMNS = {
+            _ID, HOUR, MINUTES, DAYS_OF_WEEK, ALARM_TIME,
+            ENABLED, VIBRATE, MESSAGE, ALERT };
+
+        /**
+         * These save calls to cursor.getColumnIndexOrThrow()
+         * THEY MUST BE KEPT IN SYNC WITH ABOVE QUERY COLUMNS
+         */
+        public static final int ALARM_ID_INDEX = 0;
+        public static final int ALARM_HOUR_INDEX = 1;
+        public static final int ALARM_MINUTES_INDEX = 2;
+        public static final int ALARM_DAYS_OF_WEEK_INDEX = 3;
+        public static final int ALARM_TIME_INDEX = 4;
+        public static final int ALARM_ENABLED_INDEX = 5;
+        public static final int ALARM_VIBRATE_INDEX = 6;
+        public static final int ALARM_MESSAGE_INDEX = 7;
+        public static final int ALARM_ALERT_INDEX = 8;
+    }
+    //////////////////////////////
+    // End column definitions
+    //////////////////////////////
+
+    // Public fields
+    public int        id;
+    public boolean    enabled;
+    public int        hour;
+    public int        minutes;
+    public DaysOfWeek daysOfWeek;
+    public long       time;
+    public boolean    vibrate;
+    public String     label;
+    public Uri        alert;
+    public boolean    silent;
+
+    public Alarm(Cursor c) {
+        id = c.getInt(Columns.ALARM_ID_INDEX);
+        enabled = c.getInt(Columns.ALARM_ENABLED_INDEX) == 1;
+        hour = c.getInt(Columns.ALARM_HOUR_INDEX);
+        minutes = c.getInt(Columns.ALARM_MINUTES_INDEX);
+        daysOfWeek = new DaysOfWeek(c.getInt(Columns.ALARM_DAYS_OF_WEEK_INDEX));
+        time = c.getLong(Columns.ALARM_TIME_INDEX);
+        vibrate = c.getInt(Columns.ALARM_VIBRATE_INDEX) == 1;
+        label = c.getString(Columns.ALARM_MESSAGE_INDEX);
+        String alertString = c.getString(Columns.ALARM_ALERT_INDEX);
+        if (Alarms.ALARM_ALERT_SILENT.equals(alertString)) {
+            if (Log.LOGV) {
+                Log.v("Alarm is marked as silent");
+            }
+            silent = true;
+        } else {
+            if (alertString != null && alertString.length() != 0) {
+                alert = Uri.parse(alertString);
+            }
+
+            // If the database alert is null or it failed to parse, use the
+            // default alert.
+            if (alert == null) {
+                alert = RingtoneManager.getDefaultUri(
+                        RingtoneManager.TYPE_ALARM);
+            }
+        }
+    }
+
+    public Alarm(Parcel p) {
+        id = p.readInt();
+        enabled = p.readInt() == 1;
+        hour = p.readInt();
+        minutes = p.readInt();
+        daysOfWeek = new DaysOfWeek(p.readInt());
+        time = p.readLong();
+        vibrate = p.readInt() == 1;
+        label = p.readString();
+        alert = (Uri) p.readParcelable(null);
+        silent = p.readInt() == 1;
+    }
+
+    public String getLabelOrDefault(Context context) {
+        if (label == null || label.length() == 0) {
+            return context.getString(R.string.default_label);
+        }
+        return label;
+    }
+
+    /*
+     * Days of week code as a single int.
+     * 0x00: no day
+     * 0x01: Monday
+     * 0x02: Tuesday
+     * 0x04: Wednesday
+     * 0x08: Thursday
+     * 0x10: Friday
+     * 0x20: Saturday
+     * 0x40: Sunday
+     */
+    static final class DaysOfWeek {
+
+        private static int[] DAY_MAP = new int[] {
+            Calendar.MONDAY,
+            Calendar.TUESDAY,
+            Calendar.WEDNESDAY,
+            Calendar.THURSDAY,
+            Calendar.FRIDAY,
+            Calendar.SATURDAY,
+            Calendar.SUNDAY,
+        };
+
+        // Bitmask of all repeating days
+        private int mDays;
+
+        DaysOfWeek(int days) {
+            mDays = days;
+        }
+
+        public String toString(Context context, boolean showNever) {
+            StringBuilder ret = new StringBuilder();
+
+            // no days
+            if (mDays == 0) {
+                return showNever ?
+                        context.getText(R.string.never).toString() : "";
+            }
+
+            // every day
+            if (mDays == 0x7f) {
+                return context.getText(R.string.every_day).toString();
+            }
+
+            // count selected days
+            int dayCount = 0, days = mDays;
+            while (days > 0) {
+                if ((days & 1) == 1) dayCount++;
+                days >>= 1;
+            }
+
+            // short or long form?
+            DateFormatSymbols dfs = new DateFormatSymbols();
+            String[] dayList = (dayCount > 1) ?
+                    dfs.getShortWeekdays() :
+                    dfs.getWeekdays();
+
+            // selected days
+            for (int i = 0; i < 7; i++) {
+                if ((mDays & (1 << i)) != 0) {
+                    ret.append(dayList[DAY_MAP[i]]);
+                    dayCount -= 1;
+                    if (dayCount > 0) ret.append(
+                            context.getText(R.string.day_concat));
+                }
+            }
+            return ret.toString();
+        }
+
+        private boolean isSet(int day) {
+            return ((mDays & (1 << day)) > 0);
+        }
+
+        public void set(int day, boolean set) {
+            if (set) {
+                mDays |= (1 << day);
+            } else {
+                mDays &= ~(1 << day);
+            }
+        }
+
+        public void set(DaysOfWeek dow) {
+            mDays = dow.mDays;
+        }
+
+        public int getCoded() {
+            return mDays;
+        }
+
+        // Returns days of week encoded in an array of booleans.
+        public boolean[] getBooleanArray() {
+            boolean[] ret = new boolean[7];
+            for (int i = 0; i < 7; i++) {
+                ret[i] = isSet(i);
+            }
+            return ret;
+        }
+
+        public boolean isRepeatSet() {
+            return mDays != 0;
+        }
+
+        /**
+         * returns number of days from today until next alarm
+         * @param c must be set to today
+         */
+        public int getNextAlarm(Calendar c) {
+            if (mDays == 0) {
+                return -1;
+            }
+
+            int today = (c.get(Calendar.DAY_OF_WEEK) + 5) % 7;
+
+            int day = 0;
+            int dayCount = 0;
+            for (; dayCount < 7; dayCount++) {
+                day = (today + dayCount) % 7;
+                if (isSet(day)) {
+                    break;
+                }
+            }
+            return dayCount;
+        }
+    }
+}
diff --git a/src/com/android/alarmclock/AlarmAlert.java b/src/com/android/alarmclock/AlarmAlert.java
index a309618..89a866a 100644
--- a/src/com/android/alarmclock/AlarmAlert.java
+++ b/src/com/android/alarmclock/AlarmAlert.java
@@ -17,10 +17,17 @@
 package com.android.alarmclock;
 
 import android.app.Activity;
+import android.app.Notification;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.content.Context;
+import android.content.BroadcastReceiver;
 import android.content.Intent;
+import android.content.IntentFilter;
 import android.content.SharedPreferences;
 import android.content.res.Configuration;
 import android.os.Bundle;
+import android.preference.PreferenceManager;
 import android.view.KeyEvent;
 import android.view.View;
 import android.view.ViewGroup;
@@ -39,78 +46,52 @@
  */
 public class AlarmAlert extends Activity {
 
-    private static final int SNOOZE_MINUTES = 10;
-    private static final int UNKNOWN = 0;
-    private static final int SNOOZE = 1;
-    private static final int DISMISS = 2;
-    private static final int KILLED = 3;
-    private Button mSnoozeButton;
-    private int mState = UNKNOWN;
+    // These defaults must match the values in res/xml/settings.xml
+    private static final String DEFAULT_SNOOZE = "10";
+    private static final String DEFAULT_VOLUME_BEHAVIOR = "2";
 
-    private AlarmKlaxon mKlaxon;
-    private int mAlarmId;
-    private String mLabel;
+    private Alarm mAlarm;
+    private int mVolumeBehavior;
+
+    // Receives the ALARM_KILLED action from the AlarmKlaxon.
+    private BroadcastReceiver mReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            Alarm alarm = intent.getParcelableExtra(Alarms.ALARM_INTENT_EXTRA);
+            if (mAlarm.id == alarm.id) {
+                dismiss(true);
+            }
+        }
+    };
 
     @Override
     protected void onCreate(Bundle icicle) {
         super.onCreate(icicle);
 
-        // Maintain a lock during the playback of the alarm. This lock may have
-        // already been acquired in AlarmReceiver. If the process was killed,
-        // the global wake lock is gone. Acquire again just to be sure.
-        AlarmAlertWakeLock.acquireCpuWakeLock(this);
+        mAlarm = getIntent().getParcelableExtra(Alarms.ALARM_INTENT_EXTRA);
 
-        /* FIXME Intentionally verbose: always log this until we've
-           fully debugged the app failing to start up */
-        Log.v("AlarmAlert.onCreate()");
-
-        Intent i = getIntent();
-        mAlarmId = i.getIntExtra(Alarms.ID, -1);
-
-        mKlaxon = new AlarmKlaxon();
-        mKlaxon.postPlay(this, mAlarmId);
-
-        /* allow next alarm to trigger while this activity is
-           active */
-        Alarms.disableSnoozeAlert(AlarmAlert.this);
-        Alarms.disableAlert(AlarmAlert.this, mAlarmId);
-        Alarms.setNextAlert(this);
-
-        mKlaxon.setKillerCallback(new AlarmKlaxon.KillerCallback() {
-            public void onKilled() {
-                if (Log.LOGV) Log.v("onKilled()");
-                updateSilencedText();
-
-                /* don't allow snooze */
-                mSnoozeButton.setEnabled(false);
-
-                // Dismiss the alarm but mark the state as killed so if the
-                // config changes, we show the silenced message and disable
-                // snooze.
-                dismiss();
-                mState = KILLED;
-            }
-        });
+        // Get the volume/camera button behavior setting
+        final String vol =
+                PreferenceManager.getDefaultSharedPreferences(this)
+                .getString(SettingsActivity.KEY_VOLUME_BEHAVIOR,
+                        DEFAULT_VOLUME_BEHAVIOR);
+        mVolumeBehavior = Integer.parseInt(vol);
 
         requestWindowFeature(android.view.Window.FEATURE_NO_TITLE);
-        getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
+        getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
+                | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
+                | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
+                | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
         updateLayout();
+
+        // Register to get the alarm killed intent.
+        registerReceiver(mReceiver, new IntentFilter(Alarms.ALARM_KILLED));
     }
 
-    private void setTitleFromIntent(Intent i) {
-        mLabel = i.getStringExtra(Alarms.LABEL);
-        if (mLabel == null || mLabel.length() == 0) {
-            mLabel = getString(R.string.default_label);
-        }
+    private void setTitle() {
+        String label = mAlarm.getLabelOrDefault(this);
         TextView title = (TextView) findViewById(R.id.alertTitle);
-        title.setText(mLabel);
-    }
-
-    private void updateSilencedText() {
-        TextView silenced = (TextView) findViewById(R.id.silencedText);
-        silenced.setText(getString(R.string.alarm_alert_alert_silenced,
-                    AlarmKlaxon.ALARM_TIMEOUT_SECONDS / 60));
-        silenced.setVisibility(View.VISIBLE);
+        title.setText(label);
     }
 
     // This method is overwritten in AlarmAlertFullScreen in order to show a
@@ -140,77 +121,87 @@
 
         /* snooze behavior: pop a snooze confirmation view, kick alarm
            manager. */
-        mSnoozeButton = (Button) findViewById(R.id.snooze);
-        mSnoozeButton.requestFocus();
-        // If this was a configuration change, keep the silenced text if the
-        // alarm was killed.
-        if (mState == KILLED) {
-            updateSilencedText();
-            mSnoozeButton.setEnabled(false);
-        } else {
-            mSnoozeButton.setOnClickListener(new Button.OnClickListener() {
-                public void onClick(View v) {
-                    snooze();
-                    finish();
-                }
-            });
-        }
+        Button snooze = (Button) findViewById(R.id.snooze);
+        snooze.requestFocus();
+        snooze.setOnClickListener(new Button.OnClickListener() {
+            public void onClick(View v) {
+                snooze();
+            }
+        });
 
         /* dismiss button: close notification */
         findViewById(R.id.dismiss).setOnClickListener(
                 new Button.OnClickListener() {
                     public void onClick(View v) {
-                        dismiss();
-                        finish();
+                        dismiss(false);
                     }
                 });
 
-        /* Set the title from the passed in label */
-        setTitleFromIntent(getIntent());
+        /* Set the title from the passed in alarm */
+        setTitle();
     }
 
     // Attempt to snooze this alert.
     private void snooze() {
-        if (mState != UNKNOWN) {
-            return;
-        }
-        // If the next alarm is set for sooner than the snooze interval, don't
-        // snooze. Instead, toast the user that the snooze will not be set.
+        final String snooze =
+                PreferenceManager.getDefaultSharedPreferences(this)
+                .getString(SettingsActivity.KEY_ALARM_SNOOZE, DEFAULT_SNOOZE);
+        int snoozeMinutes = Integer.parseInt(snooze);
+
         final long snoozeTime = System.currentTimeMillis()
-                + (1000 * 60 * SNOOZE_MINUTES);
-        final long nextAlarm =
-                Alarms.calculateNextAlert(AlarmAlert.this).getAlert();
-        String displayTime = null;
-        if (nextAlarm < snoozeTime) {
-            final Calendar c = Calendar.getInstance();
-            c.setTimeInMillis(nextAlarm);
-            displayTime = getString(R.string.alarm_alert_snooze_not_set,
-                    Alarms.formatTime(AlarmAlert.this, c));
-            mState = DISMISS;
-        } else {
-            Alarms.saveSnoozeAlert(AlarmAlert.this, mAlarmId, snoozeTime,
-                    mLabel);
-            Alarms.setNextAlert(AlarmAlert.this);
-            displayTime = getString(R.string.alarm_alert_snooze_set,
-                    SNOOZE_MINUTES);
-            mState = SNOOZE;
-        }
+                + (1000 * 60 * snoozeMinutes);
+        Alarms.saveSnoozeAlert(AlarmAlert.this, mAlarm.id, snoozeTime);
+
+        // Get the display time for the snooze and update the notification.
+        final Calendar c = Calendar.getInstance();
+        c.setTimeInMillis(snoozeTime);
+
+        // Append (snoozed) to the label.
+        String label = mAlarm.getLabelOrDefault(this);
+        label = getString(R.string.alarm_notify_snooze_label, label);
+
+        // Notify the user that the alarm has been snoozed.
+        Intent cancelSnooze = new Intent(this, AlarmReceiver.class);
+        cancelSnooze.setAction(Alarms.CANCEL_SNOOZE);
+        cancelSnooze.putExtra(Alarms.ALARM_ID, mAlarm.id);
+        PendingIntent broadcast =
+                PendingIntent.getBroadcast(this, mAlarm.id, cancelSnooze, 0);
+        NotificationManager nm = getNotificationManager();
+        Notification n = new Notification(R.drawable.stat_notify_alarm,
+                label, 0);
+        n.setLatestEventInfo(this, label,
+                getString(R.string.alarm_notify_snooze_text,
+                    Alarms.formatTime(this, c)), broadcast);
+        n.deleteIntent = broadcast;
+        n.flags |= Notification.FLAG_AUTO_CANCEL;
+        nm.notify(mAlarm.id, n);
+
+        String displayTime = getString(R.string.alarm_alert_snooze_set,
+                snoozeMinutes);
         // Intentionally log the snooze time for debugging.
         Log.v(displayTime);
+
         // Display the snooze minutes in a toast.
         Toast.makeText(AlarmAlert.this, displayTime, Toast.LENGTH_LONG).show();
-        mKlaxon.stop(this, mState == SNOOZE);
-        releaseLocks();
+        stopService(new Intent(Alarms.ALARM_ALERT_ACTION));
+        finish();
+    }
+
+    private NotificationManager getNotificationManager() {
+        return (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
     }
 
     // Dismiss the alarm.
-    private void dismiss() {
-        if (mState != UNKNOWN) {
-            return;
+    private void dismiss(boolean killed) {
+        // The service told us that the alarm has been killed, do not modify
+        // the notification or stop the service.
+        if (!killed) {
+            // Cancel the notification and stop playing the alarm
+            NotificationManager nm = getNotificationManager();
+            nm.cancel(mAlarm.id);
+            stopService(new Intent(Alarms.ALARM_ALERT_ACTION));
         }
-        mState = DISMISS;
-        mKlaxon.stop(this, false);
-        releaseLocks();
+        finish();
     }
 
     /**
@@ -220,87 +211,57 @@
     @Override
     protected void onNewIntent(Intent intent) {
         super.onNewIntent(intent);
+
         if (Log.LOGV) Log.v("AlarmAlert.OnNewIntent()");
-        mState = UNKNOWN;
-        mSnoozeButton.setEnabled(true);
 
-        mAlarmId = intent.getIntExtra(Alarms.ID, -1);
-        // Play the new alarm sound.
-        mKlaxon.postPlay(this, mAlarmId);
+        mAlarm = intent.getParcelableExtra(Alarms.ALARM_INTENT_EXTRA);
 
-        setTitleFromIntent(intent);
-
-        /* unset silenced message */
-        TextView silenced = (TextView)findViewById(R.id.silencedText);
-        silenced.setVisibility(View.GONE);
-
-        Alarms.setNextAlert(this);
-        setIntent(intent);
-    }
-
-    @Override
-    protected void onResume() {
-        super.onResume();
-        if (Log.LOGV) Log.v("AlarmAlert.onResume()");
-        // Acquire a separate lock for the screen to stay on. This is necessary
-        // to avoid flashing the keyguard when the screen is locked.
-        AlarmAlertWakeLock.acquireScreenWakeLock(this);
+        setTitle();
     }
 
     @Override
     protected void onStop() {
         super.onStop();
-        if (Log.LOGV) Log.v("AlarmAlert.onStop()");
-        // As a last resort, try to snooze if this activity is stopped.
-        snooze();
-        // We might have been killed by the KillerCallback so always release
-        // the lock and keyguard.
-        releaseLocks();
+        // Don't hang around.
+        finish();
+    }
+    
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        if (Log.LOGV) Log.v("AlarmAlert.onDestroy()");
+        // No longer care about the alarm being killed.
+        unregisterReceiver(mReceiver);
     }
 
     @Override
     public boolean dispatchKeyEvent(KeyEvent event) {
-        // Do this on key down to handle a few of the system keys. Only handle
-        // the snooze and dismiss this alert if the state is unknown.
+        // Do this on key down to handle a few of the system keys.
         boolean up = event.getAction() == KeyEvent.ACTION_UP;
-        boolean dismiss = false;
         switch (event.getKeyCode()) {
-            case KeyEvent.KEYCODE_DPAD_UP:
-            case KeyEvent.KEYCODE_DPAD_DOWN:
-            case KeyEvent.KEYCODE_DPAD_LEFT:
-            case KeyEvent.KEYCODE_DPAD_RIGHT:
-            case KeyEvent.KEYCODE_DPAD_CENTER:
-            // Ignore ENDCALL because we do not receive the event if the screen
-            // is on. However, we do receive the key up for ENDCALL if the
-            // screen was off.
-            case KeyEvent.KEYCODE_ENDCALL:
-                break;
-            // Volume keys dismiss the alarm
+            // Volume keys and camera keys dismiss the alarm
             case KeyEvent.KEYCODE_VOLUME_UP:
             case KeyEvent.KEYCODE_VOLUME_DOWN:
-                dismiss = true;
-            // All other keys will snooze the alarm
-            default:
-                // Check for UNKNOWN here so that we intercept both key events
-                // and prevent the volume keys from triggering their default
-                // behavior.
-                if (mState == UNKNOWN && up) {
-                    if (dismiss) {
-                        dismiss();
-                    } else {
-                        snooze();
+            case KeyEvent.KEYCODE_CAMERA:
+            case KeyEvent.KEYCODE_FOCUS:
+                if (up) {
+                    switch (mVolumeBehavior) {
+                        case 1:
+                            snooze();
+                            break;
+
+                        case 2:
+                            dismiss(false);
+                            break;
+
+                        default:
+                            break;
                     }
-                    finish();
                 }
                 return true;
+            default:
+                break;
         }
         return super.dispatchKeyEvent(event);
     }
-
-    /**
-     * release wake and keyguard locks
-     */
-    private synchronized void releaseLocks() {
-        AlarmAlertWakeLock.release();
-    }
 }
diff --git a/src/com/android/alarmclock/AlarmAlertFullScreen.java b/src/com/android/alarmclock/AlarmAlertFullScreen.java
index 07d0d9c..c00ffce 100644
--- a/src/com/android/alarmclock/AlarmAlertFullScreen.java
+++ b/src/com/android/alarmclock/AlarmAlertFullScreen.java
@@ -16,10 +16,8 @@
 
 package com.android.alarmclock;
 
-import android.graphics.drawable.BitmapDrawable;
-import android.view.View;
-import android.view.Gravity;
-import android.view.LayoutInflater;
+import android.os.Bundle;
+import android.view.WindowManager;
 
 /**
  * Full screen alarm alert: pops visible indicator and plays alarm tone. This
@@ -27,17 +25,14 @@
  * background is the current wallpaper.
  */
 public class AlarmAlertFullScreen extends AlarmAlert {
-
     @Override
-    final protected View inflateView(LayoutInflater inflater) {
-        View v = inflater.inflate(R.layout.alarm_alert, null);
-
-        // Display the wallpaper as the background.
-        BitmapDrawable wallpaper = (BitmapDrawable) getWallpaper();
-        wallpaper.setGravity(Gravity.CENTER);
-        v.setBackgroundDrawable(wallpaper);
-
-        return v;
+    protected void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
     }
-
+    
+    @Override
+    public void onBackPressed() {
+        // Don't allow back to dismiss.
+        return;
+    }
 }
diff --git a/src/com/android/alarmclock/AlarmAlertWakeLock.java b/src/com/android/alarmclock/AlarmAlertWakeLock.java
index 0291df8..8cbcd94 100644
--- a/src/com/android/alarmclock/AlarmAlertWakeLock.java
+++ b/src/com/android/alarmclock/AlarmAlertWakeLock.java
@@ -25,7 +25,6 @@
  */
 class AlarmAlertWakeLock {
 
-    private static PowerManager.WakeLock sScreenWakeLock;
     private static PowerManager.WakeLock sCpuWakeLock;
 
     static void acquireCpuWakeLock(Context context) {
@@ -44,31 +43,11 @@
         sCpuWakeLock.acquire();
     }
 
-    static void acquireScreenWakeLock(Context context) {
-        Log.v("Acquiring screen wake lock");
-        if (sScreenWakeLock != null) {
-            return;
-        }
-
-        PowerManager pm =
-                (PowerManager) context.getSystemService(Context.POWER_SERVICE);
-
-        sScreenWakeLock = pm.newWakeLock(
-                PowerManager.FULL_WAKE_LOCK |
-                PowerManager.ACQUIRE_CAUSES_WAKEUP |
-                PowerManager.ON_AFTER_RELEASE, Log.LOGTAG);
-        sScreenWakeLock.acquire();
-    }
-
-    static void release() {
-        Log.v("Releasing wake lock");
+    static void releaseCpuLock() {
+        Log.v("Releasing cpu wake lock");
         if (sCpuWakeLock != null) {
             sCpuWakeLock.release();
             sCpuWakeLock = null;
         }
-        if (sScreenWakeLock != null) {
-            sScreenWakeLock.release();
-            sScreenWakeLock = null;
-        }
     }
 }
diff --git a/src/com/android/alarmclock/AlarmClock.java b/src/com/android/alarmclock/AlarmClock.java
index 9804994..75477fd 100644
--- a/src/com/android/alarmclock/AlarmClock.java
+++ b/src/com/android/alarmclock/AlarmClock.java
@@ -22,6 +22,7 @@
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.SharedPreferences;
+import android.content.res.Configuration;
 import android.database.Cursor;
 import android.net.Uri;
 import android.os.Bundle;
@@ -34,7 +35,11 @@
 import android.view.MenuItem;
 import android.view.View;
 import android.view.View.OnClickListener;
+import android.view.View.OnCreateContextMenuListener;
 import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.AdapterView.AdapterContextMenuInfo;
+import android.widget.AdapterView.OnItemClickListener;
 import android.widget.CursorAdapter;
 import android.widget.ListView;
 import android.widget.TextView;
@@ -46,7 +51,7 @@
 /**
  * AlarmClock application.
  */
-public class AlarmClock extends Activity {
+public class AlarmClock extends Activity implements OnItemClickListener {
 
     final static String PREFERENCES = "AlarmClock";
     final static String PREF_CLOCK_FACE = "face";
@@ -63,8 +68,6 @@
     private LayoutInflater mFactory;
     private ViewGroup mClockLayout;
     private View mClock = null;
-    private MenuItem mAddAlarmItem;
-    private MenuItem mToggleClockItem;
     private ListView mAlarmsList;
     private Cursor mCursor;
 
@@ -104,58 +107,36 @@
         }
 
         public void bindView(View view, Context context, Cursor cursor) {
-            final int id = cursor.getInt(Alarms.AlarmColumns.ALARM_ID_INDEX);
-            final int hour = cursor.getInt(Alarms.AlarmColumns.ALARM_HOUR_INDEX);
-            final int minutes = cursor.getInt(Alarms.AlarmColumns.ALARM_MINUTES_INDEX);
-            final Alarms.DaysOfWeek daysOfWeek = new Alarms.DaysOfWeek(
-                    cursor.getInt(Alarms.AlarmColumns.ALARM_DAYS_OF_WEEK_INDEX));
-            final boolean enabled = cursor.getInt(Alarms.AlarmColumns.ALARM_ENABLED_INDEX) == 1;
-            final String label =
-                    cursor.getString(Alarms.AlarmColumns.ALARM_MESSAGE_INDEX);
+            final Alarm alarm = new Alarm(cursor);
 
             CheckBox onButton = (CheckBox)view.findViewById(R.id.alarmButton);
-            onButton.setChecked(enabled);
+            onButton.setChecked(alarm.enabled);
             onButton.setOnClickListener(new OnClickListener() {
                     public void onClick(View v) {
                         boolean isChecked = ((CheckBox) v).isChecked();
-                        Alarms.enableAlarm(AlarmClock.this, id, isChecked);
+                        Alarms.enableAlarm(AlarmClock.this, alarm.id,
+                            isChecked);
                         if (isChecked) {
-                            SetAlarm.popAlarmSetToast(
-                                    AlarmClock.this, hour, minutes, daysOfWeek);
+                            SetAlarm.popAlarmSetToast(AlarmClock.this,
+                                alarm.hour, alarm.minutes, alarm.daysOfWeek);
                         }
                     }
             });
 
-            DigitalClock digitalClock = (DigitalClock)view.findViewById(R.id.digitalClock);
-            if (Log.LOGV) Log.v("bindView " + cursor.getPosition() + " " + id + " " + hour +
-                                ":" + minutes + " " + daysOfWeek.toString(context, true) + " dc " + digitalClock);
-
-            digitalClock.setOnClickListener(new OnClickListener() {
-                    public void onClick(View v) {
-                        if (true) {
-                            Intent intent = new Intent(AlarmClock.this, SetAlarm.class);
-                            intent.putExtra(Alarms.ID, id);
-                            startActivity(intent);
-                        } else {
-                            // TESTING: immediately pop alarm
-                            Intent fireAlarm = new Intent(AlarmClock.this, AlarmAlert.class);
-                            fireAlarm.putExtra(Alarms.ID, id);
-                            fireAlarm.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-                            startActivity(fireAlarm);
-                        }
-                    }
-                });
+            DigitalClock digitalClock =
+                    (DigitalClock) view.findViewById(R.id.digitalClock);
 
             // set the alarm text
             final Calendar c = Calendar.getInstance();
-            c.set(Calendar.HOUR_OF_DAY, hour);
-            c.set(Calendar.MINUTE, minutes);
+            c.set(Calendar.HOUR_OF_DAY, alarm.hour);
+            c.set(Calendar.MINUTE, alarm.minutes);
             digitalClock.updateTime(c);
 
             // Set the repeat text or leave it blank if it does not repeat.
-            TextView daysOfWeekView = (TextView) digitalClock.findViewById(R.id.daysOfWeek);
+            TextView daysOfWeekView =
+                    (TextView) digitalClock.findViewById(R.id.daysOfWeek);
             final String daysOfWeekStr =
-                    daysOfWeek.toString(AlarmClock.this, false);
+                    alarm.daysOfWeek.toString(AlarmClock.this, false);
             if (daysOfWeekStr != null && daysOfWeekStr.length() != 0) {
                 daysOfWeekView.setText(daysOfWeekStr);
                 daysOfWeekView.setVisibility(View.VISIBLE);
@@ -166,39 +147,52 @@
             // Display the label
             TextView labelView =
                     (TextView) digitalClock.findViewById(R.id.label);
-            if (label != null && label.length() != 0) {
-                labelView.setText(label);
+            if (alarm.label != null && alarm.label.length() != 0) {
+                labelView.setText(alarm.label);
+                labelView.setVisibility(View.VISIBLE);
             } else {
-                labelView.setText(R.string.default_label);
+                labelView.setVisibility(View.GONE);
             }
-
-            // Build context menu
-            digitalClock.setOnCreateContextMenuListener(new View.OnCreateContextMenuListener() {
-                    public void onCreateContextMenu(ContextMenu menu, View view,
-                                                    ContextMenuInfo menuInfo) {
-                        menu.setHeaderTitle(Alarms.formatTime(AlarmClock.this, c));
-                        MenuItem deleteAlarmItem = menu.add(0, id, 0, R.string.delete_alarm);
-                    }
-                });
         }
     };
 
     @Override
     public boolean onContextItemSelected(final MenuItem item) {
-        // Confirm that the alarm will be deleted.
-        new AlertDialog.Builder(this)
-                .setTitle(getString(R.string.delete_alarm))
-                .setMessage(getString(R.string.delete_alarm_confirm))
-                .setPositiveButton(android.R.string.ok,
-                        new DialogInterface.OnClickListener() {
-                            public void onClick(DialogInterface d, int w) {
-                                Alarms.deleteAlarm(AlarmClock.this,
-                                        item.getItemId());
-                            }
-                        })
-                .setNegativeButton(android.R.string.cancel, null)
-                .show();
-        return true;
+        final AdapterContextMenuInfo info =
+                (AdapterContextMenuInfo) item.getMenuInfo();
+        final int id = (int) info.id;
+        switch (item.getItemId()) {
+            case R.id.delete_alarm:
+                // Confirm that the alarm will be deleted.
+                new AlertDialog.Builder(this)
+                        .setTitle(getString(R.string.delete_alarm))
+                        .setMessage(getString(R.string.delete_alarm_confirm))
+                        .setPositiveButton(android.R.string.ok,
+                                new DialogInterface.OnClickListener() {
+                                    public void onClick(DialogInterface d,
+                                            int w) {
+                                        Alarms.deleteAlarm(AlarmClock.this, id);
+                                    }
+                                })
+                        .setNegativeButton(android.R.string.cancel, null)
+                        .show();
+                return true;
+
+            case R.id.enable_alarm:
+                final Cursor c = (Cursor) mAlarmsList.getAdapter()
+                        .getItem(info.position);
+                final Alarm alarm = new Alarm(c);
+                Alarms.enableAlarm(this, alarm.id, !alarm.enabled);
+                if (!alarm.enabled) {
+                    SetAlarm.popAlarmSetToast(this, alarm.hour, alarm.minutes,
+                            alarm.daysOfWeek);
+                }
+                return true;
+
+            default:
+                break;
+        }
+        return super.onContextItemSelected(item);
     }
 
     @Override
@@ -209,48 +203,38 @@
         mAm = ampm[0];
         mPm = ampm[1];
 
-        // sanity check -- no database, no clock
-        if (getContentResolver() == null) {
-            new AlertDialog.Builder(this)
-                    .setTitle(getString(R.string.error))
-                    .setMessage(getString(R.string.dberror))
-                    .setPositiveButton(
-                            android.R.string.ok,
-                            new DialogInterface.OnClickListener() {
-                                public void onClick(DialogInterface dialog, int which) {
-                                    finish();
-                                }
-                            })
-                    .setOnCancelListener(
-                            new DialogInterface.OnCancelListener() {
-                                public void onCancel(DialogInterface dialog) {
-                                    finish();
-                                }})
-                    .setIcon(android.R.drawable.ic_dialog_alert)
-                    .create().show();
-            return;
-        }
-
-        setContentView(R.layout.alarm_clock);
         mFactory = LayoutInflater.from(this);
         mPrefs = getSharedPreferences(PREFERENCES, 0);
-
         mCursor = Alarms.getAlarmsCursor(getContentResolver());
+
+        updateLayout();
+        setClockVisibility(mPrefs.getBoolean(PREF_SHOW_CLOCK, true));
+    }
+
+    @Override
+    public void onConfigurationChanged(Configuration newConfig) {
+        super.onConfigurationChanged(newConfig);
+        updateLayout();
+        inflateClock();
+    }
+
+    private void updateLayout() {
+        setContentView(R.layout.alarm_clock);
         mAlarmsList = (ListView) findViewById(R.id.alarms_list);
         mAlarmsList.setAdapter(new AlarmTimeAdapter(this, mCursor));
         mAlarmsList.setVerticalScrollBarEnabled(true);
-        mAlarmsList.setItemsCanFocus(true);
+        mAlarmsList.setOnItemClickListener(this);
+        mAlarmsList.setOnCreateContextMenuListener(this);
 
         mClockLayout = (ViewGroup) findViewById(R.id.clock_layout);
         mClockLayout.setOnClickListener(new View.OnClickListener() {
                 public void onClick(View v) {
-                    final Intent intent = new Intent(AlarmClock.this, ClockPicker.class);
+                    final Intent intent =
+                            new Intent(AlarmClock.this, ClockPicker.class);
                     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                     startActivity(intent);
                 }
             });
-
-        setClockVisibility(mPrefs.getBoolean(PREF_SHOW_CLOCK, true));
     }
 
     @Override
@@ -259,10 +243,11 @@
 
         int face = mPrefs.getInt(PREF_CLOCK_FACE, 0);
         if (mFace != face) {
-            if (face < 0 || face >= AlarmClock.CLOCKS.length)
+            if (face < 0 || face >= AlarmClock.CLOCKS.length) {
                 mFace = 0;
-            else
+            } else {
                 mFace = face;
+            }
             inflateClock();
         }
     }
@@ -301,6 +286,45 @@
         return super.onCreateOptionsMenu(menu);
     }
 
+    @Override
+    public void onCreateContextMenu(ContextMenu menu, View view,
+            ContextMenuInfo menuInfo) {
+        // Inflate the menu from xml.
+        getMenuInflater().inflate(R.menu.context_menu, menu);
+
+        // Use the current item to create a custom view for the header.
+        final AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;
+        final Cursor c =
+                (Cursor) mAlarmsList.getAdapter().getItem((int) info.position);
+        final Alarm alarm = new Alarm(c);
+
+        // Construct the Calendar to compute the time.
+        final Calendar cal = Calendar.getInstance();
+        cal.set(Calendar.HOUR_OF_DAY, alarm.hour);
+        cal.set(Calendar.MINUTE, alarm.minutes);
+        final String time = Alarms.formatTime(this, cal);
+
+        // Inflate the custom view and set each TextView's text.
+        final View v = mFactory.inflate(R.layout.context_menu_header, null);
+        TextView textView = (TextView) v.findViewById(R.id.header_time);
+        textView.setText(time);
+        textView = (TextView) v.findViewById(R.id.header_label);
+        textView.setText(alarm.label);
+
+        // Set the custom view on the menu.
+        menu.setHeaderView(v);
+        // Change the text to "disable" if the alarm is already enabled.
+        if (alarm.enabled) {
+            menu.findItem(R.id.enable_alarm).setTitle(R.string.disable_alarm);
+        }
+    }
+
+    public void onItemClick(AdapterView parent, View v, int pos, long id) {
+        Intent intent = new Intent(this, SetAlarm.class);
+        intent.putExtra(Alarms.ALARM_ID, (int) id);
+        startActivity(intent);
+    }
+
     /**
      * Only allow user to add a new alarm if there are fewer than
      * MAX_ALARM_COUNT
@@ -327,7 +351,7 @@
                     Log.v("In AlarmClock, new alarm id = " + newId);
                 }
                 Intent intent = new Intent(this, SetAlarm.class);
-                intent.putExtra(Alarms.ID, newId);
+                intent.putExtra(Alarms.ALARM_ID, newId);
                 startActivity(intent);
                 return true;
 
diff --git a/src/com/android/alarmclock/AlarmInitReceiver.java b/src/com/android/alarmclock/AlarmInitReceiver.java
index 77549b0..8657e03 100644
--- a/src/com/android/alarmclock/AlarmInitReceiver.java
+++ b/src/com/android/alarmclock/AlarmInitReceiver.java
@@ -36,7 +36,7 @@
             return;
         }
         if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {
-            Alarms.disableSnoozeAlert(context);
+            Alarms.saveSnoozeAlert(context, -1, -1);
             Alarms.disableExpiredAlarms(context);
         }
         Alarms.setNextAlert(context);
diff --git a/src/com/android/alarmclock/AlarmKlaxon.java b/src/com/android/alarmclock/AlarmKlaxon.java
index 95bb0e2..7205db6 100644
--- a/src/com/android/alarmclock/AlarmKlaxon.java
+++ b/src/com/android/alarmclock/AlarmKlaxon.java
@@ -16,47 +16,45 @@
 
 package com.android.alarmclock;
 
-import android.content.ContentResolver;
+import android.app.Service;
 import android.content.Context;
+import android.content.Intent;
 import android.content.res.AssetFileDescriptor;
 import android.content.res.Resources;
 import android.media.AudioManager;
 import android.media.MediaPlayer;
 import android.media.MediaPlayer.OnErrorListener;
+import android.media.RingtoneManager;
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.Handler;
+import android.os.IBinder;
 import android.os.Message;
 import android.os.Vibrator;
+import android.telephony.PhoneStateListener;
 import android.telephony.TelephonyManager;
 
 /**
- * Manages alarms and vibe.  Singleton, so it can be initiated in
- * AlarmReceiver and shut down in the AlarmAlert activity
+ * Manages alarms and vibe. Runs as a service so that it can continue to play
+ * if another activity overrides the AlarmAlert dialog.
  */
-class AlarmKlaxon implements Alarms.AlarmSettings {
-
-    interface KillerCallback {
-        public void onKilled();
-    }
+public class AlarmKlaxon extends Service {
 
     /** Play alarm up to 10 minutes before silencing */
-    final static int ALARM_TIMEOUT_SECONDS = 10 * 60;
+    private static final int ALARM_TIMEOUT_SECONDS = 10 * 60;
 
     private static final long[] sVibratePattern = new long[] { 500, 500 };
 
-    private int mAlarmId;
-    private String mAlert;
-    private Alarms.DaysOfWeek mDaysOfWeek;
-    private boolean mVibrate;
     private boolean mPlaying = false;
     private Vibrator mVibrator;
     private MediaPlayer mMediaPlayer;
-    private KillerCallback mKillerCallback;
+    private Alarm mCurrentAlarm;
+    private long mStartTime;
+    private TelephonyManager mTelephonyManager;
+    private int mInitialCallState;
 
     // Internal messages
     private static final int KILLER = 1000;
-    private static final int PLAY   = 1001;
     private Handler mHandler = new Handler() {
         public void handleMessage(Message msg) {
             switch (msg.what) {
@@ -64,103 +62,167 @@
                     if (Log.LOGV) {
                         Log.v("*********** Alarm killer triggered ***********");
                     }
-                    if (mKillerCallback != null) {
-                        mKillerCallback.onKilled();
-                    }
-                    break;
-                case PLAY:
-                    play((Context) msg.obj, msg.arg1);
+                    sendKillBroadcast((Alarm) msg.obj);
+                    stopSelf();
                     break;
             }
         }
     };
 
-    AlarmKlaxon() {
+    private PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
+        @Override
+        public void onCallStateChanged(int state, String ignored) {
+            // The user might already be in a call when the alarm fires. When
+            // we register onCallStateChanged, we get the initial in-call state
+            // which kills the alarm. Check against the initial call state so
+            // we don't kill the alarm during a call.
+            if (state != TelephonyManager.CALL_STATE_IDLE
+                    && state != mInitialCallState) {
+                sendKillBroadcast(mCurrentAlarm);
+                stopSelf();
+            }
+        }
+    };
+
+    @Override
+    public void onCreate() {
         mVibrator = new Vibrator();
+        // Listen for incoming calls to kill the alarm.
+        mTelephonyManager =
+                (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
+        mTelephonyManager.listen(
+                mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
+        AlarmAlertWakeLock.acquireCpuWakeLock(this);
     }
 
-    public void reportAlarm(
-            int idx, boolean enabled, int hour, int minutes,
-            Alarms.DaysOfWeek daysOfWeek, boolean vibrate, String message,
-            String alert) {
-        if (Log.LOGV) Log.v("AlarmKlaxon.reportAlarm: " + idx + " " + hour +
-                            " " + minutes + " dow " + daysOfWeek);
-        mAlert = alert;
-        mDaysOfWeek = daysOfWeek;
-        mVibrate = vibrate;
+    @Override
+    public void onDestroy() {
+        stop();
+        // Stop listening for incoming calls.
+        mTelephonyManager.listen(mPhoneStateListener, 0);
+        AlarmAlertWakeLock.releaseCpuLock();
     }
 
-    public void postPlay(final Context context, final int alarmId) {
-        mHandler.sendMessage(mHandler.obtainMessage(PLAY, alarmId, 0, context));
+    @Override
+    public IBinder onBind(Intent intent) {
+        return null;
+    }
+
+    @Override
+    public int onStartCommand(Intent intent, int flags, int startId) {
+        // No intent, tell the system not to restart us.
+        if (intent == null) {
+            stopSelf();
+            return START_NOT_STICKY;
+        }
+
+        final Alarm alarm = intent.getParcelableExtra(
+                Alarms.ALARM_INTENT_EXTRA);
+
+        if (alarm == null) {
+            Log.v("AlarmKlaxon failed to parse the alarm from the intent");
+            stopSelf();
+            return START_NOT_STICKY;
+        }
+
+        if (mCurrentAlarm != null) {
+            sendKillBroadcast(mCurrentAlarm);
+        }
+
+        play(alarm);
+        mCurrentAlarm = alarm;
+        // Record the initial call state here so that the new alarm has the
+        // newest state.
+        mInitialCallState = mTelephonyManager.getCallState();
+
+        return START_STICKY;
+    }
+
+    private void sendKillBroadcast(Alarm alarm) {
+        long millis = System.currentTimeMillis() - mStartTime;
+        int minutes = (int) Math.round(millis / 60000.0);
+        Intent alarmKilled = new Intent(Alarms.ALARM_KILLED);
+        alarmKilled.putExtra(Alarms.ALARM_INTENT_EXTRA, alarm);
+        alarmKilled.putExtra(Alarms.ALARM_KILLED_TIMEOUT, minutes);
+        sendBroadcast(alarmKilled);
     }
 
     // Volume suggested by media team for in-call alarms.
     private static final float IN_CALL_VOLUME = 0.125f;
 
-    private void play(Context context, int alarmId) {
-        ContentResolver contentResolver = context.getContentResolver();
+    private void play(Alarm alarm) {
+        // stop() checks to see if we are already playing.
+        stop();
 
-        if (mPlaying) stop(context, false);
+        if (Log.LOGV) {
+            Log.v("AlarmKlaxon.play() " + alarm.id + " alert " + alarm.alert);
+        }
 
-        mAlarmId = alarmId;
-
-        /* this will call reportAlarm() callback */
-        Alarms.getAlarm(contentResolver, this, mAlarmId);
-
-        if (Log.LOGV) Log.v("AlarmKlaxon.play() " + mAlarmId + " alert " + mAlert);
-
-        // TODO: Reuse mMediaPlayer instead of creating a new one and/or use
-        // RingtoneManager.
-        mMediaPlayer = new MediaPlayer();
-        mMediaPlayer.setOnErrorListener(new OnErrorListener() {
-            public boolean onError(MediaPlayer mp, int what, int extra) {
-                Log.e("Error occurred while playing audio.");
-                mp.stop();
-                mp.release();
-                mMediaPlayer = null;
-                return true;
+        if (!alarm.silent) {
+            Uri alert = alarm.alert;
+            // Fall back on the default alarm if the database does not have an
+            // alarm stored.
+            if (alert == null) {
+                alert = RingtoneManager.getDefaultUri(
+                        RingtoneManager.TYPE_ALARM);
+                if (Log.LOGV) {
+                    Log.v("Using default alarm: " + alert.toString());
+                }
             }
-        });
 
-        try {
-            TelephonyManager tm = (TelephonyManager) context.getSystemService(
-                    Context.TELEPHONY_SERVICE);
-            // Check if we are in a call. If we are, use the in-call alarm
-            // resource at a low volume to not disrupt the call.
-            if (tm.getCallState() != TelephonyManager.CALL_STATE_IDLE) {
-                Log.v("Using the in-call alarm");
-                mMediaPlayer.setVolume(IN_CALL_VOLUME, IN_CALL_VOLUME);
-                setDataSourceFromResource(context.getResources(),
-                        mMediaPlayer, R.raw.in_call_alarm);
-            } else {
-                mMediaPlayer.setDataSource(context, Uri.parse(mAlert));
-            }
-            startAlarm(mMediaPlayer);
-        } catch (Exception ex) {
-            Log.v("Using the fallback ringtone");
-            // The alert may be on the sd card which could be busy right now.
-            // Use the fallback ringtone.
+            // TODO: Reuse mMediaPlayer instead of creating a new one and/or use
+            // RingtoneManager.
+            mMediaPlayer = new MediaPlayer();
+            mMediaPlayer.setOnErrorListener(new OnErrorListener() {
+                public boolean onError(MediaPlayer mp, int what, int extra) {
+                    Log.e("Error occurred while playing audio.");
+                    mp.stop();
+                    mp.release();
+                    mMediaPlayer = null;
+                    return true;
+                }
+            });
+
             try {
-                // Must reset the media player to clear the error state.
-                mMediaPlayer.reset();
-                setDataSourceFromResource(context.getResources(), mMediaPlayer,
-                        com.android.internal.R.raw.fallbackring);
+                // Check if we are in a call. If we are, use the in-call alarm
+                // resource at a low volume to not disrupt the call.
+                if (mTelephonyManager.getCallState()
+                        != TelephonyManager.CALL_STATE_IDLE) {
+                    Log.v("Using the in-call alarm");
+                    mMediaPlayer.setVolume(IN_CALL_VOLUME, IN_CALL_VOLUME);
+                    setDataSourceFromResource(getResources(), mMediaPlayer,
+                            R.raw.in_call_alarm);
+                } else {
+                    mMediaPlayer.setDataSource(this, alert);
+                }
                 startAlarm(mMediaPlayer);
-            } catch (Exception ex2) {
-                // At this point we just don't play anything.
-                Log.e("Failed to play fallback ringtone", ex2);
+            } catch (Exception ex) {
+                Log.v("Using the fallback ringtone");
+                // The alert may be on the sd card which could be busy right
+                // now. Use the fallback ringtone.
+                try {
+                    // Must reset the media player to clear the error state.
+                    mMediaPlayer.reset();
+                    setDataSourceFromResource(getResources(), mMediaPlayer,
+                            com.android.internal.R.raw.fallbackring);
+                    startAlarm(mMediaPlayer);
+                } catch (Exception ex2) {
+                    // At this point we just don't play anything.
+                    Log.e("Failed to play fallback ringtone", ex2);
+                }
             }
         }
 
         /* Start the vibrator after everything is ok with the media player */
-        if (mVibrate) {
+        if (alarm.vibrate) {
             mVibrator.vibrate(sVibratePattern, 0);
         } else {
             mVibrator.cancel();
         }
 
-        enableKiller();
+        enableKiller(alarm);
         mPlaying = true;
+        mStartTime = System.currentTimeMillis();
     }
 
     // Do the common stuff when starting the alarm.
@@ -187,8 +249,8 @@
      * Stops alarm audio and disables alarm if it not snoozed and not
      * repeating
      */
-    public void stop(Context context, boolean snoozed) {
-        if (Log.LOGV) Log.v("AlarmKlaxon.stop() " + mAlarmId);
+    public void stop() {
+        if (Log.LOGV) Log.v("AlarmKlaxon.stop()");
         if (mPlaying) {
             mPlaying = false;
 
@@ -201,32 +263,19 @@
 
             // Stop vibrator
             mVibrator.cancel();
-
-            /* disable alarm only if it is not set to repeat */
-            if (!snoozed && ((mDaysOfWeek == null || !mDaysOfWeek.isRepeatSet()))) {
-                Alarms.enableAlarm(context, mAlarmId, false);
-            }
         }
         disableKiller();
     }
 
     /**
-     * This callback called when alarm killer times out unattended
-     * alarm
-     */
-    public void setKillerCallback(KillerCallback killerCallback) {
-        mKillerCallback = killerCallback;
-    }
-
-    /**
      * Kills alarm audio after ALARM_TIMEOUT_SECONDS, so the alarm
      * won't run all day.
      *
      * This just cancels the audio, but leaves the notification
      * popped, so the user will know that the alarm tripped.
      */
-    private void enableKiller() {
-        mHandler.sendMessageDelayed(mHandler.obtainMessage(KILLER),
+    private void enableKiller(Alarm alarm) {
+        mHandler.sendMessageDelayed(mHandler.obtainMessage(KILLER, alarm),
                 1000 * ALARM_TIMEOUT_SECONDS);
     }
 
diff --git a/src/com/android/alarmclock/AlarmPreference.java b/src/com/android/alarmclock/AlarmPreference.java
index 0fd4f89..cb0e3f5 100644
--- a/src/com/android/alarmclock/AlarmPreference.java
+++ b/src/com/android/alarmclock/AlarmPreference.java
@@ -17,38 +17,49 @@
 package com.android.alarmclock;
 
 import android.content.Context;
+import android.media.Ringtone;
+import android.media.RingtoneManager;
 import android.net.Uri;
 import android.preference.RingtonePreference;
 import android.util.AttributeSet;
 
+/**
+ * The RingtonePreference does not have a way to get/set the current ringtone so
+ * we override onSaveRingtone and onRestoreRingtone to get the same behavior.
+ */
 public class AlarmPreference extends RingtonePreference {
-    public Uri mAlert;
-    private IRingtoneChangedListener mRingtoneChangedListener;
-
-    public interface IRingtoneChangedListener {
-        public void onRingtoneChanged(Uri ringtoneUri);
-    };
+    private Uri mAlert;
 
     public AlarmPreference(Context context, AttributeSet attrs) {
         super(context, attrs);
     }
 
-    public void setRingtoneChangedListener(IRingtoneChangedListener listener) {
-        mRingtoneChangedListener = listener;
-    }
-
     @Override
     protected void onSaveRingtone(Uri ringtoneUri) {
-        if (ringtoneUri != null) {
-            mAlert = ringtoneUri;
-            if (mRingtoneChangedListener != null) {
-                mRingtoneChangedListener.onRingtoneChanged(ringtoneUri);
-            }
-        }
+        setAlert(ringtoneUri);
     }
 
     @Override
     protected Uri onRestoreRingtone() {
         return mAlert;
     }
+
+    public void setAlert(Uri alert) {
+        mAlert = alert;
+        if (alert != null) {
+            final Ringtone r = RingtoneManager.getRingtone(getContext(), alert);
+            if (r != null) {
+                setSummary(r.getTitle(getContext()));
+            }
+        } else {
+            setSummary(R.string.silent_alarm_summary);
+        }
+    }
+
+    public String getAlertString() {
+        if (mAlert != null) {
+            return mAlert.toString();
+        }
+        return Alarms.ALARM_ALERT_SILENT;
+    }
 }
diff --git a/src/com/android/alarmclock/AlarmProvider.java b/src/com/android/alarmclock/AlarmProvider.java
index 74fdd2e..5849a38 100644
--- a/src/com/android/alarmclock/AlarmProvider.java
+++ b/src/com/android/alarmclock/AlarmProvider.java
@@ -173,38 +173,38 @@
         else
             values = new ContentValues();
 
-        if (!values.containsKey(Alarms.AlarmColumns.HOUR))
-            values.put(Alarms.AlarmColumns.HOUR, 0);
+        if (!values.containsKey(Alarm.Columns.HOUR))
+            values.put(Alarm.Columns.HOUR, 0);
 
-        if (!values.containsKey(Alarms.AlarmColumns.MINUTES))
-            values.put(Alarms.AlarmColumns.MINUTES, 0);
+        if (!values.containsKey(Alarm.Columns.MINUTES))
+            values.put(Alarm.Columns.MINUTES, 0);
 
-        if (!values.containsKey(Alarms.AlarmColumns.DAYS_OF_WEEK))
-            values.put(Alarms.AlarmColumns.DAYS_OF_WEEK, 0);
+        if (!values.containsKey(Alarm.Columns.DAYS_OF_WEEK))
+            values.put(Alarm.Columns.DAYS_OF_WEEK, 0);
 
-        if (!values.containsKey(Alarms.AlarmColumns.ALARM_TIME))
-            values.put(Alarms.AlarmColumns.ALARM_TIME, 0);
+        if (!values.containsKey(Alarm.Columns.ALARM_TIME))
+            values.put(Alarm.Columns.ALARM_TIME, 0);
 
-        if (!values.containsKey(Alarms.AlarmColumns.ENABLED))
-            values.put(Alarms.AlarmColumns.ENABLED, 0);
+        if (!values.containsKey(Alarm.Columns.ENABLED))
+            values.put(Alarm.Columns.ENABLED, 0);
 
-        if (!values.containsKey(Alarms.AlarmColumns.VIBRATE))
-            values.put(Alarms.AlarmColumns.VIBRATE, 1);
+        if (!values.containsKey(Alarm.Columns.VIBRATE))
+            values.put(Alarm.Columns.VIBRATE, 1);
 
-        if (!values.containsKey(Alarms.AlarmColumns.MESSAGE))
-            values.put(Alarms.AlarmColumns.MESSAGE, "");
+        if (!values.containsKey(Alarm.Columns.MESSAGE))
+            values.put(Alarm.Columns.MESSAGE, "");
 
-        if (!values.containsKey(Alarms.AlarmColumns.ALERT))
-            values.put(Alarms.AlarmColumns.ALERT, "");
+        if (!values.containsKey(Alarm.Columns.ALERT))
+            values.put(Alarm.Columns.ALERT, "");
 
         SQLiteDatabase db = mOpenHelper.getWritableDatabase();
-        long rowId = db.insert("alarms", Alarms.AlarmColumns.MESSAGE, values);
+        long rowId = db.insert("alarms", Alarm.Columns.MESSAGE, values);
         if (rowId < 0) {
             throw new SQLException("Failed to insert row into " + url);
         }
         if (Log.LOGV) Log.v("Added alarm rowId = " + rowId);
 
-        Uri newUrl = ContentUris.withAppendedId(Alarms.AlarmColumns.CONTENT_URI, rowId);
+        Uri newUrl = ContentUris.withAppendedId(Alarm.Columns.CONTENT_URI, rowId);
         getContext().getContentResolver().notifyChange(newUrl, null);
         return newUrl;
     }
diff --git a/src/com/android/alarmclock/AlarmReceiver.java b/src/com/android/alarmclock/AlarmReceiver.java
index 218db98..97374ef 100644
--- a/src/com/android/alarmclock/AlarmReceiver.java
+++ b/src/com/android/alarmclock/AlarmReceiver.java
@@ -17,9 +17,18 @@
 package com.android.alarmclock;
 
 import android.app.KeyguardManager;
+import android.app.Notification;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.content.ContentUris;
 import android.content.Context;
 import android.content.Intent;
 import android.content.BroadcastReceiver;
+import android.database.Cursor;
+import android.os.Parcel;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
 
 /**
  * Glue class: connects AlarmAlert IntentReceiver to AlarmAlert
@@ -33,30 +42,63 @@
 
     @Override
     public void onReceive(Context context, Intent intent) {
-        long now = System.currentTimeMillis();
-        int id = intent.getIntExtra(Alarms.ID, 0);
-        long setFor = intent.getLongExtra(Alarms.TIME, 0);
-
-        /* FIXME Intentionally verbose: always log this until we've
-           fully debugged the app failing to start up */
-        Log.v("AlarmReceiver.onReceive() id " + id + " setFor " + setFor +
-              " now " + now);
-
-        if (now > setFor + STALE_WINDOW * 1000) {
-            if (Log.LOGV) Log.v("AlarmReceiver ignoring stale alarm intent id"
-                                + id + " setFor " + setFor + " now " + now);
+        // Take care of the easy intents first.
+        if (Alarms.CLEAR_NOTIFICATION.equals(intent.getAction())) {
+            // If this is the "Clear All Notifications" intent, stop the alarm
+            // service and return.
+            context.stopService(new Intent(Alarms.ALARM_ALERT_ACTION));
+            return;
+        } else if (Alarms.ALARM_KILLED.equals(intent.getAction())) {
+            // The alarm has been killed, update the notification
+            updateNotification(context, (Alarm)
+                    intent.getParcelableExtra(Alarms.ALARM_INTENT_EXTRA),
+                    intent.getIntExtra(Alarms.ALARM_KILLED_TIMEOUT, -1));
+            return;
+        } else if (Alarms.CANCEL_SNOOZE.equals(intent.getAction())) {
+            Alarms.saveSnoozeAlert(context, -1, -1);
             return;
         }
 
-        // Wake the device and stay awake until the AlarmAlert intent is
-        // handled. Also acquire the screen lock so that if the AlarmAlert
-        // activity is paused, it will be resumed.
+        Alarm alarm = null;
+        // Grab the alarm from the intent. Since the remote AlarmManagerService
+        // fills in the Intent to add some extra data, it must unparcel the
+        // Alarm object. It throws a ClassNotFoundException when unparcelling.
+        // To avoid this, do the marshalling ourselves.
+        final byte[] data = intent.getByteArrayExtra(Alarms.ALARM_RAW_DATA);
+        if (data != null) {
+            Parcel in = Parcel.obtain();
+            in.unmarshall(data, 0, data.length);
+            in.setDataPosition(0);
+            alarm = Alarm.CREATOR.createFromParcel(in);
+        }
+
+        if (alarm == null) {
+            Log.v("AlarmReceiver failed to parse the alarm from the intent");
+            return;
+        }
+
+        // Intentionally verbose: always log the alarm time to provide useful
+        // information in bug reports.
+        long now = System.currentTimeMillis();
+        SimpleDateFormat format =
+                new SimpleDateFormat("HH:mm:ss.SSS aaa");
+        Log.v("AlarmReceiver.onReceive() id " + alarm.id + " setFor "
+                + format.format(new Date(alarm.time)));
+
+        if (now > alarm.time + STALE_WINDOW * 1000) {
+            if (Log.LOGV) {
+                Log.v("AlarmReceiver ignoring stale alarm");
+            }
+            return;
+        }
+
+        // Maintain a cpu wake lock until the AlarmAlert and AlarmKlaxon can
+        // pick it up.
         AlarmAlertWakeLock.acquireCpuWakeLock(context);
-        AlarmAlertWakeLock.acquireScreenWakeLock(context);
 
         /* Close dialogs and window shade */
-        Intent i = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
-        context.sendBroadcast(i);
+        Intent closeDialogs = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
+        context.sendBroadcast(closeDialogs);
 
         // Decide which activity to start based on the state of the keyguard.
         Class c = AlarmAlert.class;
@@ -69,10 +111,92 @@
 
         /* launch UI, explicitly stating that this is not due to user action
          * so that the current app's notification management is not disturbed */
-        Intent fireAlarm = new Intent(context, c);
-        fireAlarm.putExtra(Alarms.ID, id);
-        fireAlarm.putExtra(Alarms.LABEL, intent.getStringExtra(Alarms.LABEL));
-        fireAlarm.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_USER_ACTION);
-        context.startActivity(fireAlarm);
-   }
+        Intent alarmAlert = new Intent(context, c);
+        alarmAlert.putExtra(Alarms.ALARM_INTENT_EXTRA, alarm);
+        alarmAlert.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
+                | Intent.FLAG_ACTIVITY_NO_USER_ACTION);
+        context.startActivity(alarmAlert);
+
+        // Disable the snooze alert if this alarm is the snooze.
+        Alarms.disableSnoozeAlert(context, alarm.id);
+        // Disable this alarm if it does not repeat.
+        if (!alarm.daysOfWeek.isRepeatSet()) {
+            Alarms.enableAlarm(context, alarm.id, false);
+        } else {
+            // Enable the next alert if there is one. The above call to
+            // enableAlarm will call setNextAlert so avoid calling it twice.
+            Alarms.setNextAlert(context);
+        }
+
+        // Play the alarm alert and vibrate the device.
+        Intent playAlarm = new Intent(Alarms.ALARM_ALERT_ACTION);
+        playAlarm.putExtra(Alarms.ALARM_INTENT_EXTRA, alarm);
+        context.startService(playAlarm);
+
+        // Trigger a notification that, when clicked, will show the alarm alert
+        // dialog. No need to check for fullscreen since this will always be
+        // launched from a user action.
+        Intent notify = new Intent(context, AlarmAlert.class);
+        notify.putExtra(Alarms.ALARM_INTENT_EXTRA, alarm);
+        PendingIntent pendingNotify = PendingIntent.getActivity(context,
+                alarm.id, notify, 0);
+
+        // Use the alarm's label or the default label as the ticker text and
+        // main text of the notification.
+        String label = alarm.getLabelOrDefault(context);
+        Notification n = new Notification(R.drawable.stat_notify_alarm,
+                label, alarm.time);
+        n.setLatestEventInfo(context, label,
+                context.getString(R.string.alarm_notify_text),
+                pendingNotify);
+        n.flags |= Notification.FLAG_SHOW_LIGHTS;
+        n.ledARGB = 0xFF00FF00;
+        n.ledOnMS = 500;
+        n.ledOffMS = 500;
+
+        // Set the deleteIntent for when the user clicks "Clear All
+        // Notifications"
+        Intent clearAll = new Intent(context, AlarmReceiver.class);
+        clearAll.setAction(Alarms.CLEAR_NOTIFICATION);
+        n.deleteIntent = PendingIntent.getBroadcast(context, 0, clearAll, 0);
+
+        // Send the notification using the alarm id to easily identify the
+        // correct notification.
+        NotificationManager nm = getNotificationManager(context);
+        nm.notify(alarm.id, n);
+    }
+
+    private NotificationManager getNotificationManager(Context context) {
+        return (NotificationManager)
+                context.getSystemService(Context.NOTIFICATION_SERVICE);
+    }
+
+    private void updateNotification(Context context, Alarm alarm, int timeout) {
+        NotificationManager nm = getNotificationManager(context);
+
+        // If the alarm is null, just cancel the notification.
+        if (alarm == null) {
+            if (Log.LOGV) {
+                Log.v("Cannot update notification for killer callback");
+            }
+            return;
+        }
+
+        // Launch SetAlarm when clicked.
+        Intent viewAlarm = new Intent(context, SetAlarm.class);
+        viewAlarm.putExtra(Alarms.ALARM_ID, alarm.id);
+        PendingIntent intent =
+                PendingIntent.getActivity(context, alarm.id, viewAlarm, 0);
+
+        // Update the notification to indicate that the alert has been
+        // silenced.
+        String label = alarm.getLabelOrDefault(context);
+        Notification n = new Notification(R.drawable.stat_notify_alarm,
+                label, alarm.time);
+        n.setLatestEventInfo(context, label,
+                context.getString(R.string.alarm_alert_alert_silenced, timeout),
+                intent);
+        n.flags |= Notification.FLAG_AUTO_CANCEL;
+        nm.notify(alarm.id, n);
+    }
 }
diff --git a/src/com/android/alarmclock/Alarms.java b/src/com/android/alarmclock/Alarms.java
index 8e71836..63a67d7 100644
--- a/src/com/android/alarmclock/Alarms.java
+++ b/src/com/android/alarmclock/Alarms.java
@@ -17,8 +17,6 @@
 package com.android.alarmclock;
 
 import android.app.AlarmManager;
-import android.app.Notification;
-import android.app.NotificationManager;
 import android.app.PendingIntent;
 import android.content.ContentResolver;
 import android.content.ContentValues;
@@ -28,7 +26,7 @@
 import android.content.SharedPreferences;
 import android.database.Cursor;
 import android.net.Uri;
-import android.provider.BaseColumns;
+import android.os.Parcel;
 import android.provider.Settings;
 import android.text.format.DateFormat;
 
@@ -40,354 +38,112 @@
  */
 public class Alarms {
 
-    final static String ALARM_ALERT_ACTION = "com.android.alarmclock.ALARM_ALERT";
-    final static String ID = "alarm_id";
-    final static String TIME = "alarm_time";
-    final static String LABEL = "alarm_label";
+    // This action triggers the AlarmReceiver as well as the AlarmKlaxon. It
+    // is a public action used in the manifest for receiving Alarm broadcasts
+    // from the alarm manager.
+    public static final String ALARM_ALERT_ACTION = "com.android.alarmclock.ALARM_ALERT";
+
+    // This is a private action used when the user clears all notifications.
+    public static final String CLEAR_NOTIFICATION = "clear_notification";
+
+    // This is a private action used by the AlarmKlaxon to update the UI to
+    // show the alarm has been killed.
+    public static final String ALARM_KILLED = "alarm_killed";
+
+    // Extra in the ALARM_KILLED intent to indicate to the user how long the
+    // alarm played before being killed.
+    public static final String ALARM_KILLED_TIMEOUT = "alarm_killed_timeout";
+
+    // This string is used to indicate a silent alarm in the db.
+    public static final String ALARM_ALERT_SILENT = "silent";
+
+    // This intent is sent from the notification when the user cancels the
+    // snooze alert.
+    public static final String CANCEL_SNOOZE = "cancel_snooze";
+
+    // This string is used when passing an Alarm object through an intent.
+    public static final String ALARM_INTENT_EXTRA = "intent.extra.alarm";
+
+    // This extra is the raw Alarm object data. It is used in the
+    // AlarmManagerService to avoid a ClassNotFoundException when filling in
+    // the Intent extras.
+    public static final String ALARM_RAW_DATA = "intent.extra.alarm_raw";
+
+    // This string is used to identify the alarm id passed to SetAlarm from the
+    // list of alarms.
+    public static final String ALARM_ID = "alarm_id";
 
     final static String PREF_SNOOZE_ID = "snooze_id";
     final static String PREF_SNOOZE_TIME = "snooze_time";
-    final static String PREF_SNOOZE_LABEL = "snooze_label";
 
     private final static String DM12 = "E h:mm aa";
-    private final static String DM24 = "E kk:mm";
+    private final static String DM24 = "E k:mm";
 
     private final static String M12 = "h:mm aa";
     // Shared with DigitalClock
     final static String M24 = "kk:mm";
 
     /**
-     * Mapping from days in this application (where Monday is 0) to
-     * days in DateFormatSymbols (where Monday is 2).
-     */
-    private static int[] DAY_MAP = new int[] {
-        Calendar.MONDAY,
-        Calendar.TUESDAY,
-        Calendar.WEDNESDAY,
-        Calendar.THURSDAY,
-        Calendar.FRIDAY,
-        Calendar.SATURDAY,
-        Calendar.SUNDAY,
-    };
-
-    static class DaysOfWeek {
-
-        int mDays;
-
-        /**
-         * Days of week coded as single int, convenient for DB
-         * storage:
-         *
-         * 0x00:  no day
-         * 0x01:  Monday
-         * 0x02:  Tuesday
-         * 0x04:  Wednesday
-         * 0x08:  Thursday
-         * 0x10:  Friday
-         * 0x20:  Saturday
-         * 0x40:  Sunday
-         */
-        DaysOfWeek() {
-            this(0);
-        }
-
-        DaysOfWeek(int days) {
-            mDays = days;
-        }
-
-        public String toString(Context context, boolean showNever) {
-            StringBuilder ret = new StringBuilder();
-
-            /* no days */
-            if (mDays == 0) return showNever ? context.getText(
-                    R.string.never).toString() : "";
-
-            /* every day */
-            if (mDays == 0x7f) {
-                return context.getText(R.string.every_day).toString();
-            }
-
-            /* count selected days */
-            int dayCount = 0, days = mDays;
-            while (days > 0) {
-                if ((days & 1) == 1) dayCount++;
-                days >>= 1;
-            }
-
-            /* short or long form? */
-            DateFormatSymbols dfs = new DateFormatSymbols();
-            String[] dayList = (dayCount > 1) ?
-                                    dfs.getShortWeekdays() :
-                                    dfs.getWeekdays();
-
-            /* selected days */
-            for (int i = 0; i < 7; i++) {
-                if ((mDays & (1 << i)) != 0) {
-                    ret.append(dayList[DAY_MAP[i]]);
-                    dayCount -= 1;
-                    if (dayCount > 0) ret.append(
-                            context.getText(R.string.day_concat));
-                }
-            }
-            return ret.toString();
-        }
-
-        /**
-         * @param day Mon=0 ... Sun=6
-         * @return true if given day is set
-         */
-        public boolean isSet(int day) {
-            return ((mDays & (1 << day)) > 0);
-        }
-
-        public void set(int day, boolean set) {
-            if (set) {
-                mDays |= (1 << day);
-            } else {
-                mDays &= ~(1 << day);
-            }
-        }
-
-        public void set(DaysOfWeek dow) {
-            mDays = dow.mDays;
-        }
-
-        public int getCoded() {
-            return mDays;
-        }
-
-        public boolean equals(DaysOfWeek dow) {
-            return mDays == dow.mDays;
-        }
-
-        // Returns days of week encoded in an array of booleans.
-        public boolean[] getBooleanArray() {
-            boolean[] ret = new boolean[7];
-            for (int i = 0; i < 7; i++) {
-                ret[i] = isSet(i);
-            }
-            return ret;
-        }
-
-        public void setCoded(int days) {
-            mDays = days;
-        }
-
-        /**
-         * @return true if alarm is set to repeat
-         */
-        public boolean isRepeatSet() {
-            return mDays != 0;
-        }
-
-        /**
-         * @return true if alarm is set to repeat every day
-         */
-        public boolean isEveryDaySet() {
-            return mDays == 0x7f;
-        }
-
-
-        /**
-         * returns number of days from today until next alarm
-         * @param c must be set to today
-         */
-        public int getNextAlarm(Calendar c) {
-            if (mDays == 0) return -1;
-            int today = (c.get(Calendar.DAY_OF_WEEK) + 5) % 7;
-
-            int day, dayCount;
-            for (dayCount = 0; dayCount < 7; dayCount++) {
-                day = (today + dayCount) % 7;
-                if ((mDays & (1 << day)) > 0) {
-                    break;
-                }
-            }
-            return dayCount;
-        }
-    }
-
-    public static class AlarmColumns implements BaseColumns {
-
-        /**
-         * The content:// style URL for this table
-         */
-        public static final Uri CONTENT_URI =
-            Uri.parse("content://com.android.alarmclock/alarm");
-
-        public static final String _ID = "_id";
-
-        /**
-         * The default sort order for this table
-         */
-        public static final String DEFAULT_SORT_ORDER = "_id ASC";
-
-        /**
-         * Hour in 24-hour localtime 0 - 23.
-         * <P>Type: INTEGER</P>
-         */
-        public static final String HOUR = "hour";
-
-        /**
-         * Minutes in localtime 0 - 59
-         * <P>Type: INTEGER</P>
-         */
-        public static final String MINUTES = "minutes";
-
-        /**
-         * Days of week coded as integer
-         * <P>Type: INTEGER</P>
-         */
-        public static final String DAYS_OF_WEEK = "daysofweek";
-
-        /**
-         * Alarm time in UTC milliseconds from the epoch.
-         * <P>Type: INTEGER</P>
-         */
-        public static final String ALARM_TIME = "alarmtime";
-
-        /**
-         * True if alarm is active
-         * <P>Type: BOOLEAN</P>
-         */
-        public static final String ENABLED = "enabled";
-
-        /**
-         * True if alarm should vibrate
-         * <P>Type: BOOLEAN</P>
-         */
-        public static final String VIBRATE = "vibrate";
-
-        /**
-         * Message to show when alarm triggers
-         * Note: not currently used
-         * <P>Type: STRING</P>
-         */
-        public static final String MESSAGE = "message";
-
-        /**
-         * Audio alert to play when alarm triggers
-         * <P>Type: STRING</P>
-         */
-        public static final String ALERT = "alert";
-
-        static final String[] ALARM_QUERY_COLUMNS = {
-            _ID, HOUR, MINUTES, DAYS_OF_WEEK, ALARM_TIME,
-            ENABLED, VIBRATE, MESSAGE, ALERT};
-
-        /**
-         * These save calls to cursor.getColumnIndexOrThrow()
-         * THEY MUST BE KEPT IN SYNC WITH ABOVE QUERY COLUMNS
-         */
-        public static final int ALARM_ID_INDEX = 0;
-        public static final int ALARM_HOUR_INDEX = 1;
-        public static final int ALARM_MINUTES_INDEX = 2;
-        public static final int ALARM_DAYS_OF_WEEK_INDEX = 3;
-        public static final int ALARM_TIME_INDEX = 4;
-        public static final int ALARM_ENABLED_INDEX = 5;
-        public static final int ALARM_VIBRATE_INDEX = 6;
-        public static final int ALARM_MESSAGE_INDEX = 7;
-        public static final int ALARM_ALERT_INDEX = 8;
-    }
-
-    /**
-     * getAlarm and getAlarms call this interface to report alarms in
-     * the database
-     */
-    static interface AlarmSettings {
-        void reportAlarm(
-                int idx, boolean enabled, int hour, int minutes,
-                DaysOfWeek daysOfWeek, boolean vibrate, String message,
-                String alert);
-    }
-
-    /**
      * Creates a new Alarm.
      */
-    public synchronized static Uri addAlarm(ContentResolver contentResolver) {
+    public static Uri addAlarm(ContentResolver contentResolver) {
         ContentValues values = new ContentValues();
-        values.put(Alarms.AlarmColumns.HOUR, 8);
-        return contentResolver.insert(AlarmColumns.CONTENT_URI, values);
+        values.put(Alarm.Columns.HOUR, 8);
+        return contentResolver.insert(Alarm.Columns.CONTENT_URI, values);
     }
 
     /**
      * Removes an existing Alarm.  If this alarm is snoozing, disables
      * snooze.  Sets next alert.
      */
-    public synchronized static void deleteAlarm(
+    public static void deleteAlarm(
             Context context, int alarmId) {
 
         ContentResolver contentResolver = context.getContentResolver();
         /* If alarm is snoozing, lose it */
-        int snoozeId = getSnoozeAlarmId(context);
-        if (snoozeId == alarmId) disableSnoozeAlert(context);
+        disableSnoozeAlert(context, alarmId);
 
-        Uri uri = ContentUris.withAppendedId(AlarmColumns.CONTENT_URI, alarmId);
-        deleteAlarm(contentResolver, uri);
+        Uri uri = ContentUris.withAppendedId(Alarm.Columns.CONTENT_URI, alarmId);
+        contentResolver.delete(uri, "", null);
 
         setNextAlert(context);
     }
 
-    private synchronized static void deleteAlarm(
-            ContentResolver contentResolver, Uri uri) {
-        contentResolver.delete(uri, "", null);
-    }
-
     /**
      * Queries all alarms
      * @return cursor over all alarms
      */
-    public synchronized static Cursor getAlarmsCursor(
-            ContentResolver contentResolver) {
+    public static Cursor getAlarmsCursor(ContentResolver contentResolver) {
         return contentResolver.query(
-                AlarmColumns.CONTENT_URI, AlarmColumns.ALARM_QUERY_COLUMNS,
-                null, null, AlarmColumns.DEFAULT_SORT_ORDER);
+                Alarm.Columns.CONTENT_URI, Alarm.Columns.ALARM_QUERY_COLUMNS,
+                null, null, Alarm.Columns.DEFAULT_SORT_ORDER);
+    }
+
+    // Private method to get a more limited set of alarms from the database.
+    private static Cursor getFilteredAlarmsCursor(
+            ContentResolver contentResolver) {
+        return contentResolver.query(Alarm.Columns.CONTENT_URI,
+                Alarm.Columns.ALARM_QUERY_COLUMNS, Alarm.Columns.WHERE_ENABLED,
+                null, null);
     }
 
     /**
-     * Calls the AlarmSettings.reportAlarm interface on all alarms found in db.
+     * Return an Alarm object representing the alarm id in the database.
+     * Returns null if no alarm exists.
      */
-    public synchronized static void getAlarms(
-            ContentResolver contentResolver, AlarmSettings alarmSettings) {
-        Cursor cursor = getAlarmsCursor(contentResolver);
-        getAlarms(alarmSettings, cursor);
-        cursor.close();
-    }
-
-    private synchronized static void getAlarms(
-            AlarmSettings alarmSettings, Cursor cur) {
-        if (cur.moveToFirst()) {
-            do {
-                // Get the field values
-                int id = cur.getInt(AlarmColumns.ALARM_ID_INDEX);
-                int hour = cur.getInt(AlarmColumns.ALARM_HOUR_INDEX);
-                int minutes = cur.getInt(AlarmColumns.ALARM_MINUTES_INDEX);
-                int daysOfWeek = cur.getInt(AlarmColumns.ALARM_DAYS_OF_WEEK_INDEX);
-                boolean enabled = cur.getInt(AlarmColumns.ALARM_ENABLED_INDEX) == 1 ? true : false;
-                boolean vibrate = cur.getInt(AlarmColumns.ALARM_VIBRATE_INDEX) == 1 ? true : false;
-                String message = cur.getString(AlarmColumns.ALARM_MESSAGE_INDEX);
-                String alert = cur.getString(AlarmColumns.ALARM_ALERT_INDEX);
-                alarmSettings.reportAlarm(
-                        id, enabled, hour, minutes, new DaysOfWeek(daysOfWeek),
-                        vibrate, message, alert);
-            } while (cur.moveToNext());
-        }
-    }
-
-    /**
-     * Calls the AlarmSettings.reportAlarm interface on alarm with given
-     * alarmId
-     */
-    public synchronized static void getAlarm(
-            ContentResolver contentResolver, AlarmSettings alarmSetting,
-            int alarmId) {
+    public static Alarm getAlarm(ContentResolver contentResolver, int alarmId) {
         Cursor cursor = contentResolver.query(
-                ContentUris.withAppendedId(AlarmColumns.CONTENT_URI, alarmId),
-                AlarmColumns.ALARM_QUERY_COLUMNS,
-                null, null, AlarmColumns.DEFAULT_SORT_ORDER);
-
-        getAlarms(alarmSetting, cursor);
-        cursor.close();
+                ContentUris.withAppendedId(Alarm.Columns.CONTENT_URI, alarmId),
+                Alarm.Columns.ALARM_QUERY_COLUMNS,
+                null, null, null);
+        Alarm alarm = null;
+        if (cursor != null) {
+            if (cursor.moveToFirst()) {
+                alarm = new Alarm(cursor);
+            }
+            cursor.close();
+        }
+        return alarm;
     }
 
 
@@ -405,32 +161,35 @@
      * @param message        corresponds to the MESSAGE column
      * @param alert          corresponds to the ALERT column
      */
-    public synchronized static void setAlarm(
+    public static void setAlarm(
             Context context, int id, boolean enabled, int hour, int minutes,
-            DaysOfWeek daysOfWeek, boolean vibrate, String message,
+            Alarm.DaysOfWeek daysOfWeek, boolean vibrate, String message,
             String alert) {
 
         ContentValues values = new ContentValues(8);
         ContentResolver resolver = context.getContentResolver();
-        long time = calculateAlarm(hour, minutes, daysOfWeek).getTimeInMillis();
+        // Set the alarm_time value if this alarm does not repeat. This will be
+        // used later to disable expired alarms.
+        long time = 0;
+        if (!daysOfWeek.isRepeatSet()) {
+            time = calculateAlarm(hour, minutes, daysOfWeek).getTimeInMillis();
+        }
 
         if (Log.LOGV) Log.v(
                 "**  setAlarm * idx " + id + " hour " + hour + " minutes " +
                 minutes + " enabled " + enabled + " time " + time);
 
-        values.put(AlarmColumns.ENABLED, enabled ? 1 : 0);
-        values.put(AlarmColumns.HOUR, hour);
-        values.put(AlarmColumns.MINUTES, minutes);
-        values.put(AlarmColumns.ALARM_TIME, time);
-        values.put(AlarmColumns.DAYS_OF_WEEK, daysOfWeek.getCoded());
-        values.put(AlarmColumns.VIBRATE, vibrate);
-        values.put(AlarmColumns.MESSAGE, message);
-        values.put(AlarmColumns.ALERT, alert);
-        resolver.update(ContentUris.withAppendedId(AlarmColumns.CONTENT_URI, id),
+        values.put(Alarm.Columns.ENABLED, enabled ? 1 : 0);
+        values.put(Alarm.Columns.HOUR, hour);
+        values.put(Alarm.Columns.MINUTES, minutes);
+        values.put(Alarm.Columns.ALARM_TIME, time);
+        values.put(Alarm.Columns.DAYS_OF_WEEK, daysOfWeek.getCoded());
+        values.put(Alarm.Columns.VIBRATE, vibrate);
+        values.put(Alarm.Columns.MESSAGE, message);
+        values.put(Alarm.Columns.ALERT, alert);
+        resolver.update(ContentUris.withAppendedId(Alarm.Columns.CONTENT_URI, id),
                         values, null, null);
 
-        int aid = disableSnoozeAlert(context);
-        if (aid != -1 && aid != id) enableAlarmInternal(context, aid, false);
         setNextAlert(context);
     }
 
@@ -441,103 +200,68 @@
      * @param enabled        corresponds to the ENABLED column
      */
 
-    public synchronized static void enableAlarm(
+    public static void enableAlarm(
             final Context context, final int id, boolean enabled) {
-        int aid = disableSnoozeAlert(context);
-        if (aid != -1 && aid != id) enableAlarmInternal(context, aid, false);
         enableAlarmInternal(context, id, enabled);
         setNextAlert(context);
     }
 
-    private synchronized static void enableAlarmInternal(
-            final Context context, final int id, boolean enabled) {
+    private static void enableAlarmInternal(final Context context,
+            final int id, boolean enabled) {
+        enableAlarmInternal(context, getAlarm(context.getContentResolver(), id),
+                enabled);
+    }
+
+    private static void enableAlarmInternal(final Context context,
+            final Alarm alarm, boolean enabled) {
         ContentResolver resolver = context.getContentResolver();
 
-        class EnableAlarm implements AlarmSettings {
-            public int mHour;
-            public int mMinutes;
-            public DaysOfWeek mDaysOfWeek;
-
-            public void reportAlarm(
-                    int idx, boolean enabled, int hour, int minutes,
-                    DaysOfWeek daysOfWeek, boolean vibrate, String message,
-                    String alert) {
-                mHour = hour;
-                mMinutes = minutes;
-                mDaysOfWeek = daysOfWeek;
-            }
-        }
-
         ContentValues values = new ContentValues(2);
-        values.put(AlarmColumns.ENABLED, enabled ? 1 : 0);
+        values.put(Alarm.Columns.ENABLED, enabled ? 1 : 0);
 
-        /* If we are enabling the alarm, load hour/minutes/daysOfWeek
-           from db, so we can calculate alarm time */
+        // If we are enabling the alarm, calculate alarm time since the time
+        // value in Alarm may be old.
         if (enabled) {
-            EnableAlarm enableAlarm = new EnableAlarm();
-            getAlarm(resolver, enableAlarm, id);
-            if (enableAlarm.mDaysOfWeek == null) {
-                /* Under monkey, sometimes reportAlarm is never
-                   called */
-                Log.e("** enableAlarmInternal failed " + id + " h " +
-                      enableAlarm.mHour + " m " + enableAlarm.mMinutes);
-                return;
+            long time = 0;
+            if (!alarm.daysOfWeek.isRepeatSet()) {
+                time = calculateAlarm(alarm.hour, alarm.minutes,
+                        alarm.daysOfWeek).getTimeInMillis();
             }
-
-            long time = calculateAlarm(enableAlarm.mHour, enableAlarm.mMinutes,
-                                       enableAlarm.mDaysOfWeek).getTimeInMillis();
-            values.put(AlarmColumns.ALARM_TIME, time);
+            values.put(Alarm.Columns.ALARM_TIME, time);
         }
 
-        resolver.update(ContentUris.withAppendedId(AlarmColumns.CONTENT_URI, id),
-                        values, null, null);
+        resolver.update(ContentUris.withAppendedId(
+                Alarm.Columns.CONTENT_URI, alarm.id), values, null, null);
     }
 
-
-    /**
-     * Calculates next scheduled alert
-     */
-    static class AlarmCalculator implements AlarmSettings {
-        private long mMinAlert = Long.MAX_VALUE;
-        private int mMinIdx = -1;
-        private String mLabel;
-
-        /**
-         * returns next scheduled alert, MAX_VALUE if none
-         */
-        public long getAlert() {
-            return mMinAlert;
-        }
-        public int getIndex() {
-            return mMinIdx;
-        }
-        public String getLabel() {
-            return mLabel;
-        }
-
-        public void reportAlarm(
-                int idx, boolean enabled, int hour, int minutes,
-                DaysOfWeek daysOfWeek, boolean vibrate, String message,
-                String alert) {
-            if (enabled) {
-                long atTime = calculateAlarm(hour, minutes,
-                                             daysOfWeek).getTimeInMillis();
-                /* Log.i("**  SET ALERT* idx " + idx + " hour " + hour + " minutes " +
-                   minutes + " enabled " + enabled + " calc " + atTime); */
-                if (atTime < mMinAlert) {
-                    mMinIdx = idx;
-                    mMinAlert = atTime;
-                    mLabel = message;
-                }
+    public static Alarm calculateNextAlert(final Context context) {
+        Alarm alarm = null;
+        long minTime = Long.MAX_VALUE;
+        long now = System.currentTimeMillis();
+        Cursor cursor = getFilteredAlarmsCursor(context.getContentResolver());
+        if (cursor != null) {
+            if (cursor.moveToFirst()) {
+                do {
+                    Alarm a = new Alarm(cursor);
+                    // A time of 0 indicates this is a repeating alarm, so
+                    // calculate the time to get the next alert.
+                    if (a.time == 0) {
+                        a.time = calculateAlarm(a.hour, a.minutes, a.daysOfWeek)
+                                .getTimeInMillis();
+                    } else if (a.time < now) {
+                        // Expired alarm, disable it and move along.
+                        enableAlarmInternal(context, a, false);
+                        continue;
+                    }
+                    if (a.time < minTime) {
+                        minTime = a.time;
+                        alarm = a;
+                    }
+                } while (cursor.moveToNext());
             }
+            cursor.close();
         }
-    }
-
-    static AlarmCalculator calculateNextAlert(final Context context) {
-        ContentResolver resolver = context.getContentResolver();
-        AlarmCalculator alarmCalc = new AlarmCalculator();
-        getAlarms(resolver, alarmCalc);
-        return alarmCalc;
+        return alarm;
     }
 
     /**
@@ -545,54 +269,39 @@
      * boot.
      */
     public static void disableExpiredAlarms(final Context context) {
-        Cursor cur = getAlarmsCursor(context.getContentResolver());
+        Cursor cur = getFilteredAlarmsCursor(context.getContentResolver());
         long now = System.currentTimeMillis();
 
         if (cur.moveToFirst()) {
             do {
-                // Get the field values
-                int id = cur.getInt(AlarmColumns.ALARM_ID_INDEX);
-                boolean enabled = cur.getInt(
-                        AlarmColumns.ALARM_ENABLED_INDEX) == 1 ? true : false;
-                DaysOfWeek daysOfWeek = new DaysOfWeek(
-                        cur.getInt(AlarmColumns.ALARM_DAYS_OF_WEEK_INDEX));
-                long time = cur.getLong(AlarmColumns.ALARM_TIME_INDEX);
-
-                if (enabled && !daysOfWeek.isRepeatSet() && time < now) {
-                    if (Log.LOGV) Log.v(
-                            "** DISABLE " + id + " now " + now +" set " + time);
-                    enableAlarmInternal(context, id, false);
+                Alarm alarm = new Alarm(cur);
+                // A time of 0 means this alarm repeats. If the time is
+                // non-zero, check if the time is before now.
+                if (alarm.time != 0 && alarm.time < now) {
+                    if (Log.LOGV) {
+                        Log.v("** DISABLE " + alarm.id + " now " + now +" set "
+                                + alarm.time);
+                    }
+                    enableAlarmInternal(context, alarm, false);
                 }
             } while (cur.moveToNext());
         }
         cur.close();
     }
 
-    private static NotificationManager getNotificationManager(
-            final Context context) {
-        return (NotificationManager) context.getSystemService(
-                context.NOTIFICATION_SERVICE);
-    }
-
     /**
      * Called at system startup, on time/timezone change, and whenever
      * the user changes alarm settings.  Activates snooze if set,
      * otherwise loads all alarms, activates next alert.
      */
     public static void setNextAlert(final Context context) {
-        int snoozeId = getSnoozeAlarmId(context);
-        if (snoozeId == -1) {
-            AlarmCalculator ac = calculateNextAlert(context);
-            int id = ac.getIndex();
-            long atTime = ac.getAlert();
-
-            if (atTime < Long.MAX_VALUE) {
-                enableAlert(context, id, ac.getLabel(), atTime);
+        if (!enableSnoozeAlert(context)) {
+            Alarm alarm = calculateNextAlert(context);
+            if (alarm != null) {
+                enableAlert(context, alarm, alarm.time);
             } else {
-                disableAlert(context, id);
+                disableAlert(context);
             }
-        } else {
-            enableSnoozeAlert(context);
         }
     }
 
@@ -600,35 +309,38 @@
      * Sets alert in AlarmManger and StatusBar.  This is what will
      * actually launch the alert when the alarm triggers.
      *
-     * Note: In general, apps should call setNextAlert() instead of
-     * this method.  setAlert() is only used outside this class when
-     * the alert is not to be driven by the state of the db.  "Snooze"
-     * uses this API, as we do not want to alter the alarm in the db
-     * with each snooze.
-     *
-     * @param id Alarm ID.
+     * @param alarm Alarm.
      * @param atTimeInMillis milliseconds since epoch
      */
-    static void enableAlert(Context context, int id, String label,
-           long atTimeInMillis) {
+    private static void enableAlert(Context context, final Alarm alarm,
+            final long atTimeInMillis) {
         AlarmManager am = (AlarmManager)
                 context.getSystemService(Context.ALARM_SERVICE);
 
+        if (Log.LOGV) {
+            Log.v("** setAlert id " + alarm.id + " atTime " + atTimeInMillis);
+        }
+
         Intent intent = new Intent(ALARM_ALERT_ACTION);
-        if (Log.LOGV) Log.v("** setAlert id " + id + " atTime " + atTimeInMillis);
-        intent.putExtra(ID, id);
-        intent.putExtra(LABEL, label);
-        intent.putExtra(TIME, atTimeInMillis);
+
+        // XXX: This is a slight hack to avoid an exception in the remote
+        // AlarmManagerService process. The AlarmManager adds extra data to
+        // this Intent which causes it to inflate. Since the remote process
+        // does not know about the Alarm class, it throws a
+        // ClassNotFoundException.
+        //
+        // To avoid this, we marshall the data ourselves and then parcel a plain
+        // byte[] array. The AlarmReceiver class knows to build the Alarm
+        // object from the byte[] array.
+        Parcel out = Parcel.obtain();
+        alarm.writeToParcel(out, 0);
+        out.setDataPosition(0);
+        intent.putExtra(ALARM_RAW_DATA, out.marshall());
+
         PendingIntent sender = PendingIntent.getBroadcast(
                 context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
 
-        if (true) {
-            am.set(AlarmManager.RTC_WAKEUP, atTimeInMillis, sender);
-        } else {
-            // a five-second alarm, for testing
-            am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 5000,
-                   sender);
-        }
+        am.set(AlarmManager.RTC_WAKEUP, atTimeInMillis, sender);
 
         setStatusBarIcon(context, true);
 
@@ -643,48 +355,57 @@
      *
      * @param id Alarm ID.
      */
-    static void disableAlert(Context context, int id) {
+    static void disableAlert(Context context) {
         AlarmManager am = (AlarmManager)
                 context.getSystemService(Context.ALARM_SERVICE);
-        Intent intent = new Intent(ALARM_ALERT_ACTION);
-        intent.putExtra(ID, id);
         PendingIntent sender = PendingIntent.getBroadcast(
-                context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
+                context, 0, new Intent(ALARM_ALERT_ACTION),
+                PendingIntent.FLAG_CANCEL_CURRENT);
         am.cancel(sender);
         setStatusBarIcon(context, false);
         saveNextAlarm(context, "");
     }
 
-    static void saveSnoozeAlert(final Context context, int id,
-                                long atTimeInMillis, String label) {
+    static void saveSnoozeAlert(final Context context, final int id,
+            final long time) {
         SharedPreferences prefs = context.getSharedPreferences(
                 AlarmClock.PREFERENCES, 0);
         SharedPreferences.Editor ed = prefs.edit();
-        ed.putInt(PREF_SNOOZE_ID, id);
-        ed.putLong(PREF_SNOOZE_TIME, atTimeInMillis);
-        ed.putString(PREF_SNOOZE_LABEL, label);
-        ed.commit();
+        if (id == -1) {
+            clearSnoozePreference(ed);
+        } else {
+            ed.putInt(PREF_SNOOZE_ID, id);
+            ed.putLong(PREF_SNOOZE_TIME, time);
+            ed.commit();
+        }
+        // Set the next alert after updating the snooze.
+        setNextAlert(context);
     }
 
     /**
-     * @return ID of alarm disabled, if disabled, -1 otherwise
+     * Disable the snooze alert if the given id matches the snooze id.
      */
-    static int disableSnoozeAlert(final Context context) {
-        int id = getSnoozeAlarmId(context);
-        if (id == -1) return -1;
-        saveSnoozeAlert(context, -1, 0, null);
-        return id;
-    }
-
-    /**
-     * @return alarm ID of snoozing alarm, -1 if snooze unset
-     */
-    private static int getSnoozeAlarmId(final Context context) {
+    static void disableSnoozeAlert(final Context context, final int id) {
         SharedPreferences prefs = context.getSharedPreferences(
                 AlarmClock.PREFERENCES, 0);
-        return prefs.getInt(PREF_SNOOZE_ID, -1);
+        int snoozeId = prefs.getInt(PREF_SNOOZE_ID, -1);
+        if (snoozeId == -1) {
+            // No snooze set, do nothing.
+            return;
+        } else if (snoozeId == id) {
+            // This is the same id so clear the shared prefs.
+            clearSnoozePreference(prefs.edit());
+        }
     }
 
+    // Helper to remove the snooze preference. Do not use clear because that
+    // will erase the clock preferences.
+    private static void clearSnoozePreference(final SharedPreferences.Editor ed) {
+        ed.remove(PREF_SNOOZE_ID);
+        ed.remove(PREF_SNOOZE_TIME);
+        ed.commit();
+    };
+
     /**
      * If there is a snooze set, enable it in AlarmManager
      * @return true if snooze is set
@@ -694,20 +415,22 @@
                 AlarmClock.PREFERENCES, 0);
 
         int id = prefs.getInt(PREF_SNOOZE_ID, -1);
-        if (id == -1) return false;
-        long atTimeInMillis = prefs.getLong(PREF_SNOOZE_TIME, -1);
-        if (id == -1) return false;
-        // Try to get the label from the snooze preference. If null, use the
-        // default label.
-        String label = prefs.getString(PREF_SNOOZE_LABEL, null);
-        if (label == null) {
-            label = context.getString(R.string.default_label);
+        if (id == -1) {
+            return false;
         }
-        enableAlert(context, id, label, atTimeInMillis);
+        long time = prefs.getLong(PREF_SNOOZE_TIME, -1);
+
+        // Get the alarm from the db.
+        final Alarm alarm = getAlarm(context.getContentResolver(), id);
+        // The time in the database is either 0 (repeating) or a specific time
+        // for a non-repeating alarm. Update this value so the AlarmReceiver
+        // has the right time to compare.
+        alarm.time = time;
+
+        enableAlert(context, alarm, time);
         return true;
     }
 
-
     /**
      * Tells the StatusBar whether the alarm is enabled or disabled
      */
@@ -724,7 +447,7 @@
      * @param minute 0-59
      * @param daysOfWeek 0-59
      */
-    static Calendar calculateAlarm(int hour, int minute, DaysOfWeek daysOfWeek) {
+    static Calendar calculateAlarm(int hour, int minute, Alarm.DaysOfWeek daysOfWeek) {
 
         // start with now
         Calendar c = Calendar.getInstance();
@@ -752,7 +475,7 @@
     }
 
     static String formatTime(final Context context, int hour, int minute,
-                             DaysOfWeek daysOfWeek) {
+                             Alarm.DaysOfWeek daysOfWeek) {
         Calendar c = calculateAlarm(hour, minute, daysOfWeek);
         return formatTime(context, c);
     }
diff --git a/src/com/android/alarmclock/ClockPicker.java b/src/com/android/alarmclock/ClockPicker.java
index 039f5b8..31150a2 100644
--- a/src/com/android/alarmclock/ClockPicker.java
+++ b/src/com/android/alarmclock/ClockPicker.java
@@ -83,7 +83,7 @@
 
     private synchronized void selectClock(int position) {
         SharedPreferences.Editor ed = mPrefs.edit();
-        ed.putInt("face", position);
+        ed.putInt(AlarmClock.PREF_CLOCK_FACE, position);
         ed.commit();
 
         setResult(RESULT_OK);
diff --git a/src/com/android/alarmclock/RepeatPreference.java b/src/com/android/alarmclock/RepeatPreference.java
index ba33faa..6af023b 100644
--- a/src/com/android/alarmclock/RepeatPreference.java
+++ b/src/com/android/alarmclock/RepeatPreference.java
@@ -27,16 +27,11 @@
 
 public class RepeatPreference extends ListPreference {
 
-    private Alarms.DaysOfWeek mDaysOfWeek = new Alarms.DaysOfWeek();
-    private OnRepeatChangedObserver mOnRepeatChangedObserver;
-
-    public interface OnRepeatChangedObserver {
-        /** RepeatPrefrence calls this to get initial state */
-        public Alarms.DaysOfWeek getDaysOfWeek();
-
-        /** Called when this preference has changed */
-        public void onRepeatChanged(Alarms.DaysOfWeek daysOfWeek);
-    }
+    // Initial value that can be set with the values saved in the database.
+    private Alarm.DaysOfWeek mDaysOfWeek = new Alarm.DaysOfWeek(0);
+    // New value that will be set if a positive result comes back from the
+    // dialog.
+    private Alarm.DaysOfWeek mNewDaysOfWeek = new Alarm.DaysOfWeek(0);
 
     public RepeatPreference(Context context, AttributeSet attrs) {
         super(context, attrs);
@@ -55,17 +50,11 @@
         setEntryValues(values);
     }
 
-    void setOnRepeatChangedObserver(OnRepeatChangedObserver onRepeatChangedObserver) {
-        mOnRepeatChangedObserver = onRepeatChangedObserver;
-    }
-
     @Override
     protected void onDialogClosed(boolean positiveResult) {
         if (positiveResult) {
-            mOnRepeatChangedObserver.onRepeatChanged(mDaysOfWeek);
-        } else {
-            /* no change -- reset to initial state */
-            mDaysOfWeek.set(mOnRepeatChangedObserver.getDaysOfWeek());
+            mDaysOfWeek.set(mNewDaysOfWeek);
+            setSummary(mDaysOfWeek.toString(getContext(), true));
         }
     }
 
@@ -74,19 +63,23 @@
         CharSequence[] entries = getEntries();
         CharSequence[] entryValues = getEntryValues();
 
-        if (entries == null || entryValues == null) {
-            throw new IllegalStateException(
-                    "RepeatPreference requires an entries array and an entryValues array.");
-        }
-
-        mDaysOfWeek.set(mOnRepeatChangedObserver.getDaysOfWeek());
-
         builder.setMultiChoiceItems(
                 entries, mDaysOfWeek.getBooleanArray(),
                 new DialogInterface.OnMultiChoiceClickListener() {
-                    public void onClick(DialogInterface dialog, int which, boolean isChecked) {
-                        mDaysOfWeek.set(which, isChecked);
+                    public void onClick(DialogInterface dialog, int which,
+                            boolean isChecked) {
+                        mNewDaysOfWeek.set(which, isChecked);
                     }
                 });
     }
+
+    public void setDaysOfWeek(Alarm.DaysOfWeek dow) {
+        mDaysOfWeek.set(dow);
+        mNewDaysOfWeek.set(dow);
+        setSummary(dow.toString(getContext(), true));
+    }
+
+    public Alarm.DaysOfWeek getDaysOfWeek() {
+        return mDaysOfWeek;
+    }
 }
diff --git a/src/com/android/alarmclock/SetAlarm.java b/src/com/android/alarmclock/SetAlarm.java
index c141812..03533af 100644
--- a/src/com/android/alarmclock/SetAlarm.java
+++ b/src/com/android/alarmclock/SetAlarm.java
@@ -16,25 +16,27 @@
 
 package com.android.alarmclock;
 
-import android.app.Activity;
-import android.app.Dialog;
 import android.app.TimePickerDialog;
 import android.content.Context;
 import android.content.Intent;
-import android.database.ContentObserver;
-import android.media.Ringtone;
 import android.media.RingtoneManager;
 import android.net.Uri;
 import android.os.Bundle;
-import android.os.Handler;
 import android.preference.CheckBoxPreference;
 import android.preference.EditTextPreference;
 import android.preference.Preference;
 import android.preference.PreferenceActivity;
 import android.preference.PreferenceScreen;
 import android.text.format.DateFormat;
+import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup.LayoutParams;
+import android.widget.Button;
+import android.widget.FrameLayout;
+import android.widget.LinearLayout;
+import android.widget.ListView;
 import android.widget.TimePicker;
 import android.widget.Toast;
 
@@ -42,245 +44,156 @@
  * Manages each alarm
  */
 public class SetAlarm extends PreferenceActivity
-        implements Alarms.AlarmSettings, TimePickerDialog.OnTimeSetListener {
+        implements TimePickerDialog.OnTimeSetListener {
 
     private EditTextPreference mLabel;
-    private CheckBoxPreference mAlarmOnPref;
     private Preference mTimePref;
     private AlarmPreference mAlarmPref;
     private CheckBoxPreference mVibratePref;
     private RepeatPreference mRepeatPref;
-    private ContentObserver mAlarmsChangeObserver;
     private MenuItem mDeleteAlarmItem;
     private MenuItem mTestAlarmItem;
 
-    private int mId;
-    private int mHour;
-    private int mMinutes;
-    private Alarms.DaysOfWeek mDaysOfWeek = new Alarms.DaysOfWeek();
-
-    private boolean mReportAlarmCalled;
-
-    private static final int DIALOG_TIMEPICKER = 0;
-
-    private class RingtoneChangedListener implements AlarmPreference.IRingtoneChangedListener {
-        public void onRingtoneChanged(Uri ringtoneUri) {
-            saveAlarm(false);
-        }
-    }
-
-    private class OnRepeatChangedObserver implements RepeatPreference.OnRepeatChangedObserver {
-        public void onRepeatChanged(Alarms.DaysOfWeek daysOfWeek) {
-            if (!mDaysOfWeek.equals(daysOfWeek)) {
-                mDaysOfWeek.set(daysOfWeek);
-                saveAlarm(true);
-            }
-        }
-        public Alarms.DaysOfWeek getDaysOfWeek() {
-            return mDaysOfWeek;
-        }
-    }
-
-    private class AlarmsChangeObserver extends ContentObserver {
-        public AlarmsChangeObserver() {
-            super(new Handler());
-        }
-        @Override
-        public void onChange(boolean selfChange) {
-            Alarms.getAlarm(getContentResolver(), SetAlarm.this, mId);
-        }
-    }
+    private int     mId;
+    private boolean mEnabled;
+    private int     mHour;
+    private int     mMinutes;
 
     /**
-     * Set an alarm.  Requires an Alarms.ID to be passed in as an
-     * extra
+     * Set an alarm.  Requires an Alarms.ALARM_ID to be passed in as an
+     * extra. FIXME: Pass an Alarm object like every other Activity.
      */
     @Override
     protected void onCreate(Bundle icicle) {
         super.onCreate(icicle);
 
         addPreferencesFromResource(R.xml.alarm_prefs);
+
+        // Get each preference so we can retrieve the value later.
         mLabel = (EditTextPreference) findPreference("label");
         mLabel.setOnPreferenceChangeListener(
                 new Preference.OnPreferenceChangeListener() {
                     public boolean onPreferenceChange(Preference p,
                             Object newValue) {
+                        // Set the summary based on the new label.
                         p.setSummary((String) newValue);
-                        saveAlarm(false, (String) newValue);
                         return true;
                     }
                 });
-        mAlarmOnPref = (CheckBoxPreference)findPreference("on");
         mTimePref = findPreference("time");
         mAlarmPref = (AlarmPreference) findPreference("alarm");
         mVibratePref = (CheckBoxPreference) findPreference("vibrate");
         mRepeatPref = (RepeatPreference) findPreference("setRepeat");
 
         Intent i = getIntent();
-        mId = i.getIntExtra(Alarms.ID, -1);
-        if (Log.LOGV) Log.v("In SetAlarm, alarm id = " + mId);
+        mId = i.getIntExtra(Alarms.ALARM_ID, -1);
+        if (Log.LOGV) {
+            Log.v("In SetAlarm, alarm id = " + mId);
+        }
 
-        mReportAlarmCalled = false;
         /* load alarm details from database */
-        Alarms.getAlarm(getContentResolver(), this, mId);
-        /* This should never happen, but does occasionally with the monkey.
-         * I believe it's a race condition where a deleted alarm is opened
-         * before the alarm list is refreshed. */
-        if (!mReportAlarmCalled) {
-            Log.e("reportAlarm never called!");
-            finish();
-        }
+        Alarm alarm = Alarms.getAlarm(getContentResolver(), mId);
+        mEnabled = alarm.enabled;
+        mLabel.setText(alarm.label);
+        mLabel.setSummary(alarm.label);
+        mHour = alarm.hour;
+        mMinutes = alarm.minutes;
+        mRepeatPref.setDaysOfWeek(alarm.daysOfWeek);
+        mVibratePref.setChecked(alarm.vibrate);
+        // Give the alert uri to the preference.
+        mAlarmPref.setAlert(alarm.alert);
+        updateTime();
 
-        mAlarmsChangeObserver = new AlarmsChangeObserver();
-        getContentResolver().registerContentObserver(
-                Alarms.AlarmColumns.CONTENT_URI, true, mAlarmsChangeObserver);
+        // We have to do this to get the save/cancel buttons to highlight on
+        // their own.
+        getListView().setItemsCanFocus(true);
 
-        mAlarmPref.setRingtoneChangedListener(new RingtoneChangedListener());
-        mRepeatPref.setOnRepeatChangedObserver(new OnRepeatChangedObserver());
+        // Grab the content view so we can modify it.
+        FrameLayout content = (FrameLayout) getWindow().getDecorView()
+                .findViewById(com.android.internal.R.id.content);
+
+        // Get the main ListView and remove it from the content view.
+        ListView lv = getListView();
+        content.removeView(lv);
+
+        // Create the new LinearLayout that will become the content view and
+        // make it vertical.
+        LinearLayout ll = new LinearLayout(this);
+        ll.setOrientation(LinearLayout.VERTICAL);
+
+        // Have the ListView expand to fill the screen minus the save/cancel
+        // buttons.
+        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
+                LayoutParams.FILL_PARENT,
+                LayoutParams.WRAP_CONTENT);
+        lp.weight = 1;
+        ll.addView(lv, lp);
+
+        // Inflate the buttons onto the LinearLayout.
+        View v = LayoutInflater.from(this).inflate(
+                R.layout.save_cancel_alarm, ll);
+
+        // Attach actions to each button.
+        Button b = (Button) v.findViewById(R.id.alarm_save);
+        b.setOnClickListener(new View.OnClickListener() {
+                public void onClick(View v) {
+                    saveAlarm();
+                    finish();
+                }
+        });
+        b = (Button) v.findViewById(R.id.alarm_cancel);
+        b.setOnClickListener(new View.OnClickListener() {
+                public void onClick(View v) {
+                    finish();
+                }
+        });
+
+        // Replace the old content view with our new one.
+        setContentView(ll);
     }
 
     @Override
-    protected void onDestroy() {
-        super.onDestroy();
-        getContentResolver().unregisterContentObserver(mAlarmsChangeObserver);
-    }
-
-    @Override
-    protected Dialog onCreateDialog(int id) {
-        Dialog d;
-
-        switch (id) {
-        case DIALOG_TIMEPICKER:
-            d = new TimePickerDialog(
-                    SetAlarm.this,
-                    this,
-                    0,
-                    0,
-                    DateFormat.is24HourFormat(SetAlarm.this));
-            d.setTitle(getResources().getString(R.string.time));
-            break;
-        default:
-            d = null;
-        }
-
-        return d;
-    }
-
-    @Override
-    protected void onPrepareDialog(int id, Dialog dialog) {
-        super.onPrepareDialog(id, dialog);
-
-        switch (id) {
-        case DIALOG_TIMEPICKER:
-            TimePickerDialog timePicker = (TimePickerDialog)dialog;
-            timePicker.updateTime(mHour, mMinutes);
-            break;
-        }
-    }
-
-    @Override
-    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
-
+    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
+            Preference preference) {
         if (preference == mTimePref) {
-            showDialog(DIALOG_TIMEPICKER);
-        } else if (preference == mAlarmOnPref) {
-            saveAlarm(true);
-        } else if (preference == mVibratePref) {
-            saveAlarm(false);
+            new TimePickerDialog(this, this, mHour, mMinutes,
+                    DateFormat.is24HourFormat(this)).show();
         }
 
         return super.onPreferenceTreeClick(preferenceScreen, preference);
     }
 
+    @Override
+    public void onBackPressed() {
+        saveAlarm();
+        finish();
+    }
+
     public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
         mHour = hourOfDay;
         mMinutes = minute;
-        mAlarmOnPref.setChecked(true);
-        saveAlarm(true);
-    }
-
-    /**
-     * Alarms.AlarmSettings implementation.  Database feeds current
-     * settings in through this call
-     */
-    public void reportAlarm(
-            int idx, boolean enabled, int hour, int minutes,
-            Alarms.DaysOfWeek daysOfWeek, boolean vibrate, String label,
-            String alert) {
-
-        if (label == null || label.length() == 0) {
-            label = getString(R.string.default_label);
-        }
-        mLabel.setText(label);
-        mLabel.setSummary(label);
-        mHour = hour;
-        mMinutes = minutes;
-        mAlarmOnPref.setChecked(enabled);
-        mDaysOfWeek.set(daysOfWeek);
-        mVibratePref.setChecked(vibrate);
-
-        if (alert == null || alert.length() == 0) {
-            if (Log.LOGV) Log.v("****** reportAlarm null or 0-length alert");
-            mAlarmPref.mAlert = getDefaultAlarm();
-            if (mAlarmPref.mAlert == null) {
-                Log.e("****** Default Alarm null");
-            }
-        } else {
-            mAlarmPref.mAlert = Uri.parse(alert);
-            if (mAlarmPref.mAlert == null) {
-                Log.e("****** Parsed null alarm. URI: " + alert);
-            }
-        }
-        if (Log.LOGV) Log.v("****** reportAlarm uri " + alert + " alert " +
-                            mAlarmPref.mAlert);
         updateTime();
-        updateRepeat();
-        updateAlarm(mAlarmPref.mAlert);
-
-        mReportAlarmCalled = true;
-    }
-
-    /**
-     * picks the first alarm available
-     */
-    private Uri getDefaultAlarm() {
-        RingtoneManager ringtoneManager = new RingtoneManager(this);
-        ringtoneManager.setType(RingtoneManager.TYPE_ALARM);
-        return ringtoneManager.getRingtoneUri(0);
+        // If the time has been changed, enable the alarm.
+        mEnabled = true;
     }
 
     private void updateTime() {
-        if (Log.LOGV) Log.v("updateTime " + mId);
-        mTimePref.setSummary(Alarms.formatTime(this, mHour, mMinutes, mDaysOfWeek));
-    }
-
-    private void updateAlarm(Uri ringtoneUri) {
-        if (Log.LOGV) Log.v("updateAlarm " + mId);
-        Ringtone ringtone = RingtoneManager.getRingtone(SetAlarm.this, ringtoneUri);
-        if (ringtone != null) {
-            mAlarmPref.setSummary(ringtone.getTitle(SetAlarm.this));
+        if (Log.LOGV) {
+            Log.v("updateTime " + mId);
         }
+        mTimePref.setSummary(Alarms.formatTime(this, mHour, mMinutes,
+                mRepeatPref.getDaysOfWeek()));
     }
 
-    private void updateRepeat() {
-        if (Log.LOGV) Log.v("updateRepeat " + mId);
-        mRepeatPref.setSummary(mDaysOfWeek.toString(this, true));
-    }
+    private void saveAlarm() {
+        final String alert = mAlarmPref.getAlertString();
+        Alarms.setAlarm(this, mId, mEnabled, mHour, mMinutes,
+                mRepeatPref.getDaysOfWeek(), mVibratePref.isChecked(),
+                mLabel.getText(), alert);
 
-    private void saveAlarm(boolean popToast) {
-        saveAlarm(popToast, mLabel.getText());
-    }
-
-    /**
-     * This version of saveAlarm uses the passed in label since mLabel may
-     * contain the old value (i.e. during the preference value change).
-     */
-    private void saveAlarm(boolean popToast, String label) {
-        if (mReportAlarmCalled && mAlarmPref.mAlert != null) {
-            String alertString = mAlarmPref.mAlert.toString();
-            saveAlarm(this, mId, mAlarmOnPref.isChecked(), mHour, mMinutes,
-                      mDaysOfWeek, mVibratePref.isChecked(), label, alertString,
-                      popToast);
+        if (mEnabled) {
+            popAlarmSetToast(this, mHour, mMinutes,
+                    mRepeatPref.getDaysOfWeek());
         }
     }
 
@@ -290,7 +203,7 @@
      */
     private static void saveAlarm(
             Context context, int id, boolean enabled, int hour, int minute,
-            Alarms.DaysOfWeek daysOfWeek, boolean vibrate, String label,
+            Alarm.DaysOfWeek daysOfWeek, boolean vibrate, String label,
             String alert, boolean popToast) {
         if (Log.LOGV) Log.v("** saveAlarm " + id + " " + label + " " + enabled
                 + " " + hour + " " + minute + " vibe " + vibrate);
@@ -309,7 +222,7 @@
      * goes off.  This helps prevent "am/pm" mistakes.
      */
     static void popAlarmSetToast(Context context, int hour, int minute,
-                                 Alarms.DaysOfWeek daysOfWeek) {
+                                 Alarm.DaysOfWeek daysOfWeek) {
 
         String toastText = formatToast(context, hour, minute, daysOfWeek);
         Toast toast = Toast.makeText(context, toastText, Toast.LENGTH_LONG);
@@ -322,7 +235,7 @@
      * now"
      */
     static String formatToast(Context context, int hour, int minute,
-                              Alarms.DaysOfWeek daysOfWeek) {
+                              Alarm.DaysOfWeek daysOfWeek) {
         long alarm = Alarms.calculateAlarm(hour, minute,
                                            daysOfWeek).getTimeInMillis();
         long delta = alarm - System.currentTimeMillis();;
@@ -365,7 +278,6 @@
             mTestAlarmItem = menu.add(0, 0, 0, "test alarm");
         }
 
-
         return true;
     }
 
@@ -400,10 +312,10 @@
         int nowMinute = c.get(java.util.Calendar.MINUTE);
 
         int minutes = (nowMinute + 1) % 60;
-        int hour = nowHour + (nowMinute == 0? 1 : 0);
+        int hour = nowHour + (nowMinute == 0 ? 1 : 0);
 
-        saveAlarm(this, mId, true, hour, minutes, mDaysOfWeek, true,
-                mLabel.getText(), mAlarmPref.mAlert.toString(), true);
+        saveAlarm(this, mId, true, hour, minutes, mRepeatPref.getDaysOfWeek(),
+                true, mLabel.getText(), mAlarmPref.getAlertString(), true);
     }
 
 }
diff --git a/src/com/android/alarmclock/SettingsActivity.java b/src/com/android/alarmclock/SettingsActivity.java
index 44c4045..f0b97fd 100644
--- a/src/com/android/alarmclock/SettingsActivity.java
+++ b/src/com/android/alarmclock/SettingsActivity.java
@@ -19,6 +19,7 @@
 import android.media.AudioManager;
 import android.os.Bundle;
 import android.preference.CheckBoxPreference;
+import android.preference.ListPreference;
 import android.preference.Preference;
 import android.preference.PreferenceActivity;
 import android.preference.PreferenceScreen;
@@ -27,23 +28,23 @@
 /**
  * Settings for the Alarm Clock.
  */
-public class SettingsActivity extends PreferenceActivity {
+public class SettingsActivity extends PreferenceActivity
+        implements Preference.OnPreferenceChangeListener {
 
     private static final int ALARM_STREAM_TYPE_BIT =
             1 << AudioManager.STREAM_ALARM;
-    
+
     private static final String KEY_ALARM_IN_SILENT_MODE =
             "alarm_in_silent_mode";
-    private CheckBoxPreference mAlarmInSilentModePref;
-    
+    static final String KEY_ALARM_SNOOZE =
+            "snooze_duration";
+    static final String KEY_VOLUME_BEHAVIOR =
+            "volume_button_setting";
+
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        
         addPreferencesFromResource(R.xml.settings);
-        
-        mAlarmInSilentModePref =
-                (CheckBoxPreference) findPreference(KEY_ALARM_IN_SILENT_MODE);
     }
 
     @Override
@@ -55,34 +56,48 @@
     @Override
     public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
             Preference preference) {
-        
-        if (preference == mAlarmInSilentModePref) {
-            
+        if (KEY_ALARM_IN_SILENT_MODE.equals(preference.getKey())) {
+            CheckBoxPreference pref = (CheckBoxPreference) preference;
             int ringerModeStreamTypes = Settings.System.getInt(
                     getContentResolver(),
                     Settings.System.MODE_RINGER_STREAMS_AFFECTED, 0);
-            
-            if (mAlarmInSilentModePref.isChecked()) {
+
+            if (pref.isChecked()) {
                 ringerModeStreamTypes &= ~ALARM_STREAM_TYPE_BIT;
             } else {
                 ringerModeStreamTypes |= ALARM_STREAM_TYPE_BIT;
             }
-            
+
             Settings.System.putInt(getContentResolver(),
                     Settings.System.MODE_RINGER_STREAMS_AFFECTED,
                     ringerModeStreamTypes);
-            
+
             return true;
         }
-        
+
         return super.onPreferenceTreeClick(preferenceScreen, preference);
     }
 
-    private void refresh() {
-        int silentModeStreams = Settings.System.getInt(getContentResolver(),
-                Settings.System.MODE_RINGER_STREAMS_AFFECTED, 0);
-        mAlarmInSilentModePref.setChecked(
-                (silentModeStreams & ALARM_STREAM_TYPE_BIT) == 0);
+    public boolean onPreferenceChange(Preference pref, Object newValue) {
+        final ListPreference listPref = (ListPreference) pref;
+        final int idx = listPref.findIndexOfValue((String) newValue);
+        listPref.setSummary(listPref.getEntries()[idx]);
+        return true;
     }
-    
+
+    private void refresh() {
+        final CheckBoxPreference alarmInSilentModePref =
+                (CheckBoxPreference) findPreference(KEY_ALARM_IN_SILENT_MODE);
+        final int silentModeStreams =
+                Settings.System.getInt(getContentResolver(),
+                        Settings.System.MODE_RINGER_STREAMS_AFFECTED, 0);
+        alarmInSilentModePref.setChecked(
+                (silentModeStreams & ALARM_STREAM_TYPE_BIT) == 0);
+
+        final ListPreference snooze =
+                (ListPreference) findPreference(KEY_ALARM_SNOOZE);
+        snooze.setSummary(snooze.getEntry());
+        snooze.setOnPreferenceChangeListener(this);
+    }
+
 }