diff --git a/src/com/android/calendar/AllInOneActivity.kt b/src/com/android/calendar/AllInOneActivity.kt
index 90174eb..550bc54 100644
--- a/src/com/android/calendar/AllInOneActivity.kt
+++ b/src/com/android/calendar/AllInOneActivity.kt
@@ -358,7 +358,7 @@
         val data: Uri? = intent?.getData()
         if (data != null && data.isHierarchical()) {
             val path = data.getPathSegments()
-            if (path?.size == 2 && path!![0].equals("events")) {
+            if (path?.size == 2 && path[0].equals("events")) {
                 try {
                     mViewEventId = data.getLastPathSegment()?.toLong() as Long
                     if (mViewEventId != -1L) {
diff --git a/src/com/android/calendar/DayView.kt b/src/com/android/calendar/DayView.kt
index 96d29bb..84ad583 100644
--- a/src/com/android/calendar/DayView.kt
+++ b/src/com/android/calendar/DayView.kt
@@ -835,7 +835,7 @@
             if (diff < 0) {
                 diff += 7
             }
-            time!!.monthDay -= diff
+            time.monthDay -= diff
             time.normalize(true /* ignore isDst */)
         }
     }
@@ -1135,7 +1135,7 @@
         b.append(PERIOD_SPACE)
         val `when`: String?
         var flags: Int = DateUtils.FORMAT_SHOW_DATE
-        if (calEvent!!.allDay) {
+        if (calEvent.allDay) {
             flags = flags or (DateUtils.FORMAT_UTC or DateUtils.FORMAT_SHOW_WEEKDAY)
         } else {
             flags = flags or DateUtils.FORMAT_SHOW_TIME
@@ -1143,7 +1143,7 @@
                 flags = flags or DateUtils.FORMAT_24HOUR
             }
         }
-        `when` = Utils.formatDateRange(mContext, calEvent!!.startMillis, calEvent!!.endMillis,
+        `when` = Utils.formatDateRange(mContext, calEvent.startMillis, calEvent.endMillis,
             flags)
         b.append(`when`)
         b.append(PERIOD_SPACE)
@@ -2058,7 +2058,7 @@
         if (i < 0 || i >= layouts!!.size) {
             return null
         }
-        var layout: StaticLayout? = layouts!![i]
+        var layout: StaticLayout? = layouts[i]
         // Check if we have already initialized the StaticLayout and that
         // the width hasn't changed (due to vertical resizing which causes
         // re-layout of events at min height)
@@ -2117,16 +2117,16 @@
         x = mHoursWidth.toFloat()
         p.setStrokeWidth(GRID_LINE_INNER_WIDTH)
         // Line bounding the top of the all day area
-        mLines!![linesIndex++] = GRID_LINE_LEFT_MARGIN
-        mLines!![linesIndex++] = startY
-        mLines!![linesIndex++] = computeDayLeftPosition(mNumDays).toFloat()
-        mLines!![linesIndex++] = startY
+        mLines[linesIndex++] = GRID_LINE_LEFT_MARGIN
+        mLines[linesIndex++] = startY
+        mLines[linesIndex++] = computeDayLeftPosition(mNumDays).toFloat()
+        mLines[linesIndex++] = startY
         for (day in 0..mNumDays) {
             x = computeDayLeftPosition(day).toFloat()
-            mLines!![linesIndex++] = x
-            mLines!![linesIndex++] = startY
-            mLines!![linesIndex++] = x
-            mLines!![linesIndex++] = stopY
+            mLines[linesIndex++] = x
+            mLines[linesIndex++] = startY
+            mLines[linesIndex++] = x
+            mLines[linesIndex++] = stopY
         }
         p.setAntiAlias(false)
         canvas.drawLines(mLines, 0, linesIndex, p)
@@ -2160,7 +2160,7 @@
         var alpha: Int = eventTextPaint.getAlpha()
         eventTextPaint.setAlpha(mEventsAlpha)
         for (i in 0 until numEvents) {
-            val event: Event = events!!.get(i)
+            val event: Event = events.get(i)
             var startDay: Int = event.startDay
             var endDay: Int = event.endDay
             if (startDay > lastDay || endDay < firstDay) {
@@ -3278,12 +3278,12 @@
             for (i in 0 until numEvents) {
                 val event: Event? = events.get(i)
                 if (!event!!.drawAsAllday() ||
-                    !mShowAllAllDayEvents && event!!.getColumn() >= maxUnexpandedColumn
+                    !mShowAllAllDayEvents && event.getColumn() >= maxUnexpandedColumn
                 ) {
                     // Don't check non-allday events or events that aren't shown
                     continue
                 }
-                if (event!!.startDay <= mSelectionDay && event!!.endDay >= mSelectionDay) {
+                if (event.startDay <= mSelectionDay && event.endDay >= mSelectionDay) {
                     val numRectangles =
                         if (mShowAllAllDayEvents) mMaxAlldayEvents.toFloat()
                         else mMaxUnexpandedAlldayEventCount.toFloat()
diff --git a/src/com/android/calendar/EventInfoFragment.kt b/src/com/android/calendar/EventInfoFragment.kt
index b421778..139da7b 100644
--- a/src/com/android/calendar/EventInfoFragment.kt
+++ b/src/com/android/calendar/EventInfoFragment.kt
@@ -353,18 +353,18 @@
         window?.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND)
         val a: WindowManager.LayoutParams? = window?.getAttributes()
         a!!.dimAmount = .4f
-        a!!.width = mDialogWidth
-        a!!.height = mDialogHeight
+        a.width = mDialogWidth
+        a.height = mDialogHeight
 
         // On tablets , do smart positioning of dialog
         // On phones , use the whole screen
         if (mX != -1 || mY != -1) {
-            a!!.x = mX - mDialogWidth / 2
-            a!!.y = mY - mDialogHeight / 2
-            if (a!!.y < mMinTop) {
-                a!!.y = mMinTop + DIALOG_TOP_MARGIN
+            a.x = mX - mDialogWidth / 2
+            a.y = mY - mDialogHeight / 2
+            if (a.y < mMinTop) {
+                a.y = mMinTop + DIALOG_TOP_MARGIN
             }
-            a!!.gravity = Gravity.LEFT or Gravity.TOP
+            a.gravity = Gravity.LEFT or Gravity.TOP
         }
         window.setAttributes(a)
     }
@@ -637,7 +637,7 @@
                 resources.getColor(R.color.event_info_headline_transparent_color)
             )
             sb.setSpan(
-                transparentColorSpan, timezoneIndex, displayedDatetime!!.length,
+                transparentColorSpan, timezoneIndex, displayedDatetime.length,
                 Spannable.SPAN_INCLUSIVE_INCLUSIVE
             )
             setTextCommon(view, R.id.when_datetime, sb)
diff --git a/src/com/android/calendar/month/MonthByWeekAdapter.kt b/src/com/android/calendar/month/MonthByWeekAdapter.kt
index a7f2943..90daa97 100644
--- a/src/com/android/calendar/month/MonthByWeekAdapter.kt
+++ b/src/com/android/calendar/month/MonthByWeekAdapter.kt
@@ -262,7 +262,7 @@
         if (v !is MonthWeekEventsView) {
             return super.onTouch(v, event)
         }
-        val action: Int = event!!.getAction()
+        val action: Int = event.getAction()
 
         // Event was tapped - switch to the detailed view making sure the click animation
         // is done first.
diff --git a/src/com/android/calendar/month/MonthByWeekFragment.kt b/src/com/android/calendar/month/MonthByWeekFragment.kt
index c8e93f9..b6882b7 100644
--- a/src/com/android/calendar/month/MonthByWeekFragment.kt
+++ b/src/com/android/calendar/month/MonthByWeekFragment.kt
@@ -156,8 +156,8 @@
         if (size <= 2) {
             return
         }
-        val first: Long = (pathSegments!![size - 2])?.toLong() as Long
-        val last: Long = (pathSegments!![size - 1])?.toLong() as Long
+        val first: Long = (pathSegments[size - 2])?.toLong() as Long
+        val last: Long = (pathSegments[size - 1])?.toLong() as Long
         mTempTime.set(first)
         mFirstLoadedJulianDay = Time.getJulianDay(first, mTempTime.gmtoff)
         mTempTime.set(last)
diff --git a/src/com/android/calendar/month/MonthWeekEventsView.kt b/src/com/android/calendar/month/MonthWeekEventsView.kt
index 2f15de0..b8cdbb6 100644
--- a/src/com/android/calendar/month/MonthWeekEventsView.kt
+++ b/src/com/android/calendar/month/MonthWeekEventsView.kt
@@ -329,8 +329,8 @@
         mMonthNumPaint.setStyle(Style.FILL)
         mMonthNumPaint.setTextAlign(Align.RIGHT)
         mMonthNumPaint.setTypeface(Typeface.DEFAULT)
-        mMonthNumAscentHeight = (-mMonthNumPaint!!.ascent() + 0.5f).toInt()
-        mMonthNumHeight = (mMonthNumPaint!!.descent() - mMonthNumPaint!!.ascent() + 0.5f).toInt()
+        mMonthNumAscentHeight = (-mMonthNumPaint.ascent() + 0.5f).toInt()
+        mMonthNumHeight = (mMonthNumPaint.descent() - mMonthNumPaint.ascent() + 0.5f).toInt()
         mEventPaint = TextPaint()
         mEventPaint.setFakeBoldText(true)
         mEventPaint.setAntiAlias(true)
@@ -544,15 +544,15 @@
             i++
             offset++
         }
-        if (!mOddMonth!!.get(i)) {
-            while (++i < mOddMonth!!.size && !mOddMonth!!.get(i));
+        if (!mOddMonth.get(i)) {
+            while (++i < mOddMonth.size && !mOddMonth.get(i));
             r.right = computeDayLeftPosition(i - offset)
             r.left = 0
             p.setColor(mMonthBGOtherColor)
             canvas.drawRect(r, p)
             // compute left edge for i, set up r, draw
-        } else if (!mOddMonth!!.get(mOddMonth!!.size - 1.also { i = it })) {
-            while (--i >= offset && !mOddMonth!!.get(i));
+        } else if (!mOddMonth.get(mOddMonth.size - 1.also { i = it })) {
+            while (--i >= offset && !mOddMonth.get(i));
             i++
             // compute left edge for i, set up r, draw
             r.right = mWidth
@@ -601,7 +601,7 @@
             offset++
         }
         y = mMonthNumAscentHeight + TOP_PADDING_MONTH_NUMBER
-        var isFocusMonth: Boolean = mFocusDay!!.get(i)
+        var isFocusMonth: Boolean = mFocusDay.get(i)
         var isBold = false
         mMonthNumPaint.setColor(if (isFocusMonth) mMonthNumColor else mMonthNumOtherColor)
         while (i < numCount) {
@@ -611,10 +611,10 @@
                 if (i + 1 < numCount) {
                     // Make sure the color will be set back on the next
                     // iteration
-                    isFocusMonth = !mFocusDay!!.get(i + 1)
+                    isFocusMonth = !mFocusDay.get(i + 1)
                 }
             } else if (mFocusDay.get(i) !== isFocusMonth) {
-                isFocusMonth = mFocusDay!!.get(i)
+                isFocusMonth = mFocusDay.get(i)
                 mMonthNumPaint.setColor(if (isFocusMonth) mMonthNumColor else mMonthNumOtherColor)
             }
             x = computeDayLeftPosition(i - offset) - SIDE_PADDING_MONTH_NUMBER
@@ -857,7 +857,7 @@
         mEventExtrasPaint.setFakeBoldText(true)
         canvas.drawText(String.format(text, remainingEvents), x.toFloat(), y.toFloat(),
                 mEventExtrasPaint as Paint)
-        mEventExtrasPaint!!.setFakeBoldText(false)
+        mEventExtrasPaint.setFakeBoldText(false)
     }
 
     /**
@@ -875,13 +875,13 @@
                         (strand.points as FloatArray).size === 0) {
                     continue
                 }
-                mDNATimePaint!!.setColor(strand.color)
+                mDNATimePaint.setColor(strand.color)
                 canvas.drawLines(strand.points as FloatArray, mDNATimePaint as Paint)
             }
             // Draw black last to make sure it's on top
             val strand: Utils.DNAStrand? = mDna?.get(CONFLICT_COLOR)
-            if (strand != null && strand!!.points != null && strand!!.points?.size !== 0) {
-                mDNATimePaint!!.setColor(strand.color)
+            if (strand != null && strand.points != null && strand.points?.size !== 0) {
+                mDNATimePaint.setColor(strand.color)
                 canvas.drawLines(strand.points as FloatArray, mDNATimePaint as Paint)
             }
             if (mDayXs == null) {
@@ -889,12 +889,12 @@
             }
             val numDays = mDayXs!!.size
             val xOffset = (DNA_ALL_DAY_WIDTH - DNA_WIDTH) / 2
-            if (strand != null && strand!!.allDays != null && strand!!.allDays?.size === numDays) {
+            if (strand != null && strand.allDays != null && strand.allDays?.size === numDays) {
                 for (i in 0 until numDays) {
                     // this adds at most 7 draws. We could sort it by color and
                     // build an array instead but this is easier.
-                    if (strand!!.allDays?.get(i) !== 0) {
-                        mDNAAllDayPaint!!.setColor(strand!!.allDays!!.get(i))
+                    if (strand.allDays?.get(i) !== 0) {
+                        mDNAAllDayPaint.setColor(strand.allDays!!.get(i))
                         canvas.drawLine(mDayXs!![i].toFloat() + xOffset.toFloat(),
                                 DNA_MARGIN.toFloat(), mDayXs!![i].toFloat() + xOffset.toFloat(),
                                 DNA_MARGIN.toFloat() + DNA_ALL_DAY_HEIGHT.toFloat(),
@@ -966,7 +966,7 @@
             if (hover != null
                     && (mLastHoverTime == null || Time.compare(hover, mLastHoverTime) !== 0)) {
                 val millis: Long = hover.toMillis(true)
-                val date: String = Utils!!.formatDateRange(context, millis, millis,
+                val date: String = Utils.formatDateRange(context, millis, millis,
                         DateUtils.FORMAT_SHOW_DATE) as String
                 val accessEvent: AccessibilityEvent = AccessibilityEvent
                         .obtain(AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED)
@@ -980,7 +980,7 @@
                     for (e in events) {
                         text.add(e!!.titleAndLocation.toString() + ". ")
                         var flags: Int = DateUtils.FORMAT_SHOW_DATE or DateUtils.FORMAT_SHOW_YEAR
-                        if (!e!!.allDay) {
+                        if (!e.allDay) {
                             flags = flags or DateUtils.FORMAT_SHOW_TIME
                             if (DateFormat.is24HourFormat(context)) {
                                 flags = flags or DateUtils.FORMAT_24HOUR
@@ -988,7 +988,7 @@
                         } else {
                             flags = flags or DateUtils.FORMAT_UTC
                         }
-                        text.add(Utils.formatDateRange(context, e!!.startMillis, e!!.endMillis,
+                        text.add(Utils.formatDateRange(context, e.startMillis, e.endMillis,
                                 flags).toString() + ". ")
                     }
                 }
diff --git a/src/com/android/calendar/month/SimpleDayPickerFragment.kt b/src/com/android/calendar/month/SimpleDayPickerFragment.kt
index 0444104..c0bce5d 100644
--- a/src/com/android/calendar/month/SimpleDayPickerFragment.kt
+++ b/src/com/android/calendar/month/SimpleDayPickerFragment.kt
@@ -133,7 +133,7 @@
         @Override
         override fun onChanged() {
             val day: Time? = mAdapter!!.getSelectedDay()
-            if (day!!.year !== mSelectedDay!!.year || day!!.yearDay !== mSelectedDay.yearDay) {
+            if (day!!.year !== mSelectedDay.year || day!!.yearDay !== mSelectedDay.yearDay) {
                 goTo(day!!.toMillis(true), true, true, false)
             }
         }
diff --git a/src/com/android/calendar/month/SimpleWeekView.kt b/src/com/android/calendar/month/SimpleWeekView.kt
index c43774a..cd8eb84 100644
--- a/src/com/android/calendar/month/SimpleWeekView.kt
+++ b/src/com/android/calendar/month/SimpleWeekView.kt
@@ -207,11 +207,11 @@
             if (time.monthDay === 1) {
                 firstMonth = time.month
             }
-            mOddMonth!![i] = time.month % 2 === 1
+            mOddMonth[i] = time.month % 2 === 1
             if (time.month === focusMonth) {
-                mFocusDay!![i] = true
+                mFocusDay[i] = true
             } else {
-                mFocusDay!![i] = false
+                mFocusDay[i] = false
             }
             if (time.year === today.year && time.yearDay === today.yearDay) {
                 mHasToday = true
@@ -359,12 +359,12 @@
             canvas.drawText(mDayNumbers!![0] as String, x.toFloat(), y.toFloat(), p)
             i++
         }
-        var isFocusMonth = mFocusDay!![i]
+        var isFocusMonth = mFocusDay[i]
         mMonthNumPaint.setColor(if (isFocusMonth) mFocusMonthColor else mOtherMonthColor)
         mMonthNumPaint.setFakeBoldText(false)
         while (i < nDays) {
-            if (mFocusDay!![i] != isFocusMonth) {
-                isFocusMonth = mFocusDay!![i]
+            if (mFocusDay[i] != isFocusMonth) {
+                isFocusMonth = mFocusDay[i]
                 mMonthNumPaint.setColor(if (isFocusMonth) mFocusMonthColor else mOtherMonthColor)
             }
             if (mHasToday && mToday == i) {
diff --git a/src/com/android/calendar/widget/CalendarAppWidgetService.kt b/src/com/android/calendar/widget/CalendarAppWidgetService.kt
index 0b55c2a..0d1018f 100644
--- a/src/com/android/calendar/widget/CalendarAppWidgetService.kt
+++ b/src/com/android/calendar/widget/CalendarAppWidgetService.kt
@@ -232,7 +232,7 @@
                 views.setOnClickFillInIntent(R.id.appwidget_loading, intent)
                 return views
             }
-            if (mModel!!.mEventInfos!!.isEmpty() || mModel!!.mRowInfos!!.isEmpty()) {
+            if (mModel!!.mEventInfos.isEmpty() || mModel!!.mRowInfos.isEmpty()) {
                 val views = RemoteViews(
                     mContext?.getPackageName(),
                     R.layout.appwidget_no_events
@@ -248,12 +248,12 @@
                 return views
             }
             val rowInfo: RowInfo? = mModel?.mRowInfos?.get(position)
-            return if (rowInfo!!.mType == RowInfo!!.TYPE_DAY) {
+            return if (rowInfo!!.mType == RowInfo.TYPE_DAY) {
                 val views = RemoteViews(
                     mContext?.getPackageName(),
                     R.layout.appwidget_day
                 )
-                val dayInfo: DayInfo? = mModel?.mDayInfos?.get(rowInfo!!.mIndex)
+                val dayInfo: DayInfo? = mModel?.mDayInfos?.get(rowInfo.mIndex)
                 updateTextView(views, R.id.date, View.VISIBLE, dayInfo!!.mDayLabel)
                 views
             } else {
@@ -267,9 +267,9 @@
                 } else {
                     views = RemoteViews(mContext?.getPackageName(), R.layout.widget_item)
                 }
-                val displayColor: Int = Utils.getDisplayColorFromColor(eventInfo!!.color)
+                val displayColor: Int = Utils.getDisplayColorFromColor(eventInfo.color)
                 val now: Long = System.currentTimeMillis()
-                if (!eventInfo!!.allDay && eventInfo!!.start <= now && now <= eventInfo!!.end) {
+                if (!eventInfo.allDay && eventInfo.start <= now && now <= eventInfo.end) {
                     views.setInt(
                         R.id.widget_row, "setBackgroundResource",
                         R.drawable.agenda_item_bg_secondary
@@ -289,7 +289,7 @@
                 updateTextView(views, R.id.title, eventInfo.visibTitle as Int, eventInfo.title)
                 views.setViewVisibility(R.id.agenda_item_color, View.VISIBLE)
                 val selfAttendeeStatus: Int = eventInfo.selfAttendeeStatus as Int
-                if (eventInfo!!.allDay) {
+                if (eventInfo.allDay) {
                     if (selfAttendeeStatus == Attendees.ATTENDEE_STATUS_INVITED) {
                         views.setInt(
                             R.id.agenda_item_color, "setImageResource",
@@ -345,7 +345,7 @@
                 var start: Long = eventInfo.start as Long
                 var end: Long = eventInfo.end as Long
                 // An element in ListView.
-                if (eventInfo!!.allDay) {
+                if (eventInfo.allDay) {
                     val tz: String? = Utils.getTimeZone(mContext, null)
                     val recycle = Time()
                     start = Utils.convertAlldayLocalToUTC(recycle, start, tz as String)
