diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt
index 12753b35d..bd42914fe 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt
@@ -1,21 +1,14 @@
 package io.github.wulkanowy.ui.modules.luckynumberwidget
 
-import android.annotation.TargetApi
 import android.app.PendingIntent
 import android.app.PendingIntent.FLAG_UPDATE_CURRENT
 import android.appwidget.AppWidgetManager
-import android.appwidget.AppWidgetManager.ACTION_APPWIDGET_DELETED
-import android.appwidget.AppWidgetManager.ACTION_APPWIDGET_OPTIONS_CHANGED
-import android.appwidget.AppWidgetManager.ACTION_APPWIDGET_UPDATE
-import android.appwidget.AppWidgetManager.EXTRA_APPWIDGET_ID
-import android.appwidget.AppWidgetManager.EXTRA_APPWIDGET_IDS
-import android.appwidget.AppWidgetManager.EXTRA_APPWIDGET_OPTIONS
 import android.appwidget.AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT
-import android.appwidget.AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH
-import android.content.BroadcastReceiver
+import android.appwidget.AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH
+import android.appwidget.AppWidgetProvider
 import android.content.Context
 import android.content.Intent
-import android.os.Build
+import android.os.Bundle
 import android.view.View.GONE
 import android.view.View.VISIBLE
 import android.widget.RemoteViews
@@ -34,7 +27,7 @@ import io.reactivex.Maybe
 import timber.log.Timber
 import javax.inject.Inject
 
-class LuckyNumberWidgetProvider : BroadcastReceiver() {
+class LuckyNumberWidgetProvider : AppWidgetProvider() {
 
     @Inject
     lateinit var studentRepository: StudentRepository
@@ -59,20 +52,20 @@ class LuckyNumberWidgetProvider : BroadcastReceiver() {
         fun getStudentWidgetKey(appWidgetId: Int) = "lucky_number_widget_student_$appWidgetId"
 
         fun getThemeWidgetKey(appWidgetId: Int) = "lucky_number_widget_theme_$appWidgetId"
+
+        fun getHeightWidgetKey(appWidgetId: Int) = "lucky_number_widget_height_$appWidgetId"
+
+        fun getWidthWidgetKey(appWidgetId: Int) = "lucky_number_widget_width_$appWidgetId"
     }
 
-    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
     override fun onReceive(context: Context, intent: Intent) {
         AndroidInjection.inject(this, context)
-        when (intent.action) {
-            ACTION_APPWIDGET_UPDATE -> onUpdate(context, intent)
-            ACTION_APPWIDGET_DELETED -> onDelete(intent)
-            ACTION_APPWIDGET_OPTIONS_CHANGED -> onOptionsChange(context, intent)
-        }
+        super.onReceive(context, intent)
     }
 
-    private fun onUpdate(context: Context, intent: Intent) {
-        intent.getIntArrayExtra(EXTRA_APPWIDGET_IDS)?.forEach { appWidgetId ->
+    override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray?) {
+        super.onUpdate(context, appWidgetManager, appWidgetIds)
+        appWidgetIds?.forEach { appWidgetId ->
             val savedTheme = sharedPref.getLong(getThemeWidgetKey(appWidgetId), 0)
             val layoutId = if (savedTheme == 0L) R.layout.widget_luckynumber else R.layout.widget_luckynumber_dark
 
@@ -85,14 +78,64 @@ class LuckyNumberWidgetProvider : BroadcastReceiver() {
                 setOnClickPendingIntent(R.id.luckyNumberWidgetContainer, appIntent)
             }
 
-            setStyles(remoteView, intent)
+            setStyles(remoteView, appWidgetId)
             appWidgetManager.updateAppWidget(appWidgetId, remoteView)
         }
     }
 
-    private fun onDelete(intent: Intent) {
-        val appWidgetId = intent.getIntExtra(EXTRA_APPWIDGET_ID, 0)
-        if (appWidgetId != 0) sharedPref.delete(getStudentWidgetKey(appWidgetId))
+    override fun onDeleted(context: Context?, appWidgetIds: IntArray?) {
+        super.onDeleted(context, appWidgetIds)
+        appWidgetIds?.forEach { appWidgetId ->
+            if (appWidgetId != 0) sharedPref.delete(getStudentWidgetKey(appWidgetId))
+        }
+    }
+
+    override fun onAppWidgetOptionsChanged(context: Context, appWidgetManager: AppWidgetManager, appWidgetId: Int, newOptions: Bundle?) {
+        super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions)
+
+        val savedTheme = sharedPref.getLong(getThemeWidgetKey(appWidgetId), 0)
+        val layoutId = if (savedTheme == 0L) R.layout.widget_luckynumber else R.layout.widget_luckynumber_dark
+
+        val remoteView = RemoteViews(context.packageName, layoutId)
+
+        setStyles(remoteView, appWidgetId, newOptions)
+        appWidgetManager.updateAppWidget(appWidgetId, remoteView)
+    }
+
+    private fun setStyles(views: RemoteViews, appWidgetId: Int, options: Bundle? = null) {
+        val width = options?.getInt(OPTION_APPWIDGET_MIN_WIDTH) ?: sharedPref.getLong(getWidthWidgetKey(appWidgetId), 74).toInt()
+        val height = options?.getInt(OPTION_APPWIDGET_MAX_HEIGHT) ?: sharedPref.getLong(getHeightWidgetKey(appWidgetId), 74).toInt()
+
+        sharedPref.putLong(getWidthWidgetKey(appWidgetId), width.toLong())
+        sharedPref.putLong(getHeightWidgetKey(appWidgetId), height.toLong())
+
+        val rows = getCellsForSize(height)
+        val cols = getCellsForSize(width)
+
+        Timber.d("New lucky number widget measurement: %dx%d", width, height)
+        Timber.d("Widget size: $cols x $rows")
+
+        when {
+            1 == cols && 1 == rows -> views.setVisibility(imageTop = false, imageLeft = false)
+            1 == cols && 1 < rows -> views.setVisibility(imageTop = true, imageLeft = false)
+            1 < cols && 1 == rows -> views.setVisibility(imageTop = false, imageLeft = true)
+            1 == cols && 1 == rows -> views.setVisibility(imageTop = true, imageLeft = false)
+            2 == cols && 1 == rows -> views.setVisibility(imageTop = false, imageLeft = true)
+            else -> views.setVisibility(imageTop = false, imageLeft = false, title = true)
+        }
+    }
+
+    private fun RemoteViews.setVisibility(imageTop: Boolean, imageLeft: Boolean, title: Boolean = false) {
+        setViewVisibility(R.id.luckyNumberWidgetImageTop, if (imageTop) VISIBLE else GONE)
+        setViewVisibility(R.id.luckyNumberWidgetImageLeft, if (imageLeft) VISIBLE else GONE)
+        setViewVisibility(R.id.luckyNumberWidgetTitle, if (title) VISIBLE else GONE)
+        setViewVisibility(R.id.luckyNumberWidgetNumber, VISIBLE)
+    }
+
+    private fun getCellsForSize(size: Int): Int {
+        var n = 2
+        while (74 * n - 30 < size) ++n
+        return n - 1
     }
 
     private fun getLuckyNumber(studentId: Long, appWidgetId: Int): LuckyNumber? {
@@ -124,69 +167,4 @@ class LuckyNumberWidgetProvider : BroadcastReceiver() {
             null
         }
     }
-
-    private fun onOptionsChange(context: Context, intent: Intent) {
-        intent.extras?.getInt(EXTRA_APPWIDGET_ID)?.let { appWidgetId ->
-            val savedTheme = sharedPref.getLong(getThemeWidgetKey(appWidgetId), 0)
-            val layoutId = if (savedTheme == 0L) R.layout.widget_luckynumber else R.layout.widget_luckynumber_dark
-
-            val remoteView = RemoteViews(context.packageName, layoutId)
-
-            setStyles(remoteView, intent)
-            appWidgetManager.updateAppWidget(appWidgetId, remoteView)
-        }
-    }
-
-    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
-    private fun setStyles(views: RemoteViews, intent: Intent) {
-        val options = intent.extras?.getBundle(EXTRA_APPWIDGET_OPTIONS)
-
-        val maxWidth = options?.getInt(OPTION_APPWIDGET_MAX_WIDTH) ?: 150
-        val maxHeight = options?.getInt(OPTION_APPWIDGET_MAX_HEIGHT) ?: 40
-
-        Timber.d("New lucky number widget measurement: %dx%d", maxWidth, maxHeight)
-
-        when {
-            // 1x1
-            maxWidth < 150 && maxHeight < 110 -> {
-                Timber.d("Lucky number widget size: 1x1")
-                with(views) {
-                    setViewVisibility(R.id.luckyNumberWidgetImageTop, GONE)
-                    setViewVisibility(R.id.luckyNumberWidgetImageLeft, GONE)
-                    setViewVisibility(R.id.luckyNumberWidgetTitle, GONE)
-                    setViewVisibility(R.id.luckyNumberWidgetNumber, VISIBLE)
-                }
-            }
-            // 1x2
-            maxWidth < 150 && maxHeight > 110 -> {
-                Timber.d("Lucky number widget size: 1x2")
-                with(views) {
-                    setViewVisibility(R.id.luckyNumberWidgetImageTop, VISIBLE)
-                    setViewVisibility(R.id.luckyNumberWidgetImageLeft, GONE)
-                    setViewVisibility(R.id.luckyNumberWidgetTitle, GONE)
-                    setViewVisibility(R.id.luckyNumberWidgetNumber, VISIBLE)
-                }
-            }
-            // 2x1
-            maxWidth >= 150 && maxHeight <= 110 -> {
-                Timber.d("Lucky number widget size: 2x1")
-                with(views) {
-                    setViewVisibility(R.id.luckyNumberWidgetImageTop, GONE)
-                    setViewVisibility(R.id.luckyNumberWidgetImageLeft, VISIBLE)
-                    setViewVisibility(R.id.luckyNumberWidgetTitle, GONE)
-                    setViewVisibility(R.id.luckyNumberWidgetNumber, VISIBLE)
-                }
-            }
-            // 2x2 and bigger
-            else -> {
-                Timber.d("Lucky number widget size: 2x2 and bigger")
-                with(views) {
-                    setViewVisibility(R.id.luckyNumberWidgetImageTop, GONE)
-                    setViewVisibility(R.id.luckyNumberWidgetImageLeft, GONE)
-                    setViewVisibility(R.id.luckyNumberWidgetTitle, VISIBLE)
-                    setViewVisibility(R.id.luckyNumberWidgetNumber, VISIBLE)
-                }
-            }
-        }
-    }
 }