diff --git a/app/src/custom/res/drawable/donation_img.xml b/app/src/custom/res/drawable/donation_img.xml
new file mode 100644
index 0000000000000000000000000000000000000000..de93a9ce7c2549c4a352e72a58be68d365487c8a
--- /dev/null
+++ b/app/src/custom/res/drawable/donation_img.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Used to create the image to be shown in the donation popup-->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:drawable="@drawable/background_main"
+    android:gravity="fill_horizontal|fill_vertical"/>
+    <item android:drawable="@drawable/logo"
+        android:gravity="center"
+        />
+</layer-list>
diff --git a/app/src/main/java/se/leap/bitmaskclient/EipFragment.java b/app/src/main/java/se/leap/bitmaskclient/EipFragment.java
index 51f787b785540fa33bf6f330ecdda80703108a93..61abd6ce32c53d9d781048e6ea3f9134ff622183 100644
--- a/app/src/main/java/se/leap/bitmaskclient/EipFragment.java
+++ b/app/src/main/java/se/leap/bitmaskclient/EipFragment.java
@@ -25,27 +25,21 @@ import android.content.ServiceConnection;
 import android.content.SharedPreferences;
 import android.graphics.ColorMatrix;
 import android.graphics.ColorMatrixColorFilter;
-import android.net.Uri;
 import android.os.Bundle;
 import android.os.IBinder;
 import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
+import android.support.v4.app.DialogFragment;
 import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentTransaction;
 import android.support.v7.app.AlertDialog;
 import android.support.v7.widget.AppCompatImageView;
 import android.support.v7.widget.AppCompatTextView;
-import android.text.TextUtils;
 import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.Button;
 
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.time.temporal.ChronoUnit;
-import java.util.Date;
-import java.util.Locale;
 import java.util.Observable;
 import java.util.Observer;
 
@@ -58,23 +52,17 @@ import de.blinkt.openvpn.core.OpenVPNService;
 import de.blinkt.openvpn.core.ProfileManager;
 import se.leap.bitmaskclient.eip.EipCommand;
 import se.leap.bitmaskclient.eip.EipStatus;
-import se.leap.bitmaskclient.utils.DateHelper;
+import se.leap.bitmaskclient.fragments.DonationReminderDialog;
 import se.leap.bitmaskclient.views.VpnStateImage;
 
 import static android.view.View.GONE;
 import static android.view.View.VISIBLE;
 import static de.blinkt.openvpn.core.ConnectionStatus.LEVEL_NONETWORK;
-import static se.leap.bitmaskclient.Constants.DONATION_REMINDER_DURATION;
 import static se.leap.bitmaskclient.Constants.EIP_RESTART_ON_BOOT;
-import static se.leap.bitmaskclient.Constants.FIRST_TIME_USER_DATE;
 import static se.leap.bitmaskclient.Constants.PROVIDER_KEY;
 import static se.leap.bitmaskclient.Constants.REQUEST_CODE_LOG_IN;
 import static se.leap.bitmaskclient.Constants.REQUEST_CODE_SWITCH_PROVIDER;
 import static se.leap.bitmaskclient.Constants.SHARED_PREFERENCES;
-import static se.leap.bitmaskclient.Constants.DONATION_URL;
-import static se.leap.bitmaskclient.Constants.ENABLE_DONATION;
-import static se.leap.bitmaskclient.Constants.ENABLE_DONATION_REMINDER;
-import static se.leap.bitmaskclient.Constants.LAST_DONATION_REMINDER_DATE;
 import static se.leap.bitmaskclient.ProviderAPI.UPDATE_INVALID_VPN_CERTIFICATE;
 import static se.leap.bitmaskclient.ProviderAPI.USER_MESSAGE;
 import static se.leap.bitmaskclient.R.string.vpn_certificate_user_message;
@@ -85,7 +73,6 @@ public class EipFragment extends Fragment implements Observer {
 
     public static final String ASK_TO_CANCEL_VPN = "ask_to_cancel_vpn";
 
-
     private SharedPreferences preferences;
     private Provider provider;
 
@@ -172,8 +159,8 @@ public class EipFragment extends Fragment implements Observer {
     @Override
     public void onStart() {
         super.onStart();
-        if (isDonationReminderCallable()) {
-            showDonationReminder();
+        if (DonationReminderDialog.isCallable(getContext())) {
+            showDonationReminderDialog();
         }
     }
 
@@ -509,71 +496,16 @@ public class EipFragment extends Fragment implements Observer {
         }
     }
 
-    private void showDonationReminder() {
-        Activity activity = getActivity();
-        if (activity == null) {
-            Log.e(TAG, "activity is null when triggering donation reminder");
-            return;
-        }
-        String message = TextUtils.isEmpty(activity.getString(R.string.donate_message)) ?
-                activity.getString(R.string.donate_default_message) : activity.getString(R.string.donate_message);
-        AlertDialog.Builder alertBuilder = new AlertDialog.Builder(activity);
-        alertDialog = alertBuilder.setTitle(activity.getString(R.string.donate_title))
-                .setMessage(message)
-                .setPositiveButton(R.string.donate_button_donate, new DialogInterface.OnClickListener() {
-                    public void onClick(DialogInterface dialog, int which) {
-                        Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(DONATION_URL));
-                        startActivity(browserIntent);
-                    }
-                })
-                .setNegativeButton(R.string.donate_button_remind_later, new DialogInterface.OnClickListener() {
-                    public void onClick(DialogInterface dialog, int which) {
-                    }
-                }).setOnDismissListener(new DialogInterface.OnDismissListener() {
-                    @Override
-                    public void onDismiss(DialogInterface dialog) {
-                        preferences.edit().putString(LAST_DONATION_REMINDER_DATE,
-                                DateHelper.getCurrentDateString()).apply();
-                    }
-                }).show();
-    }
-
-    private boolean isDonationReminderCallable() {
-        if (!ENABLE_DONATION || !ENABLE_DONATION_REMINDER) {
-            return false;
-        }
-
-        if (preferences == null) {
-            Log.e(TAG, "preferences is null!");
-            return false;
-        }
-
-        String firstTimeUserDate = preferences.getString(FIRST_TIME_USER_DATE, null);
-        if (firstTimeUserDate == null) {
-            preferences.edit().putString(FIRST_TIME_USER_DATE, DateHelper.getCurrentDateString()).apply();
-            return false;
-        }
-
+    public void showDonationReminderDialog() {
         try {
-            long diffDays;
-
-            diffDays = DateHelper.getDateDiffToCurrentDateInDays(firstTimeUserDate);
-            if (diffDays < 1) {
-                return false;
-            }
-
-            String lastDonationReminderDate = preferences.getString(LAST_DONATION_REMINDER_DATE, null);
-            if (lastDonationReminderDate == null) {
-                return true;
-            }
-            diffDays = DateHelper.getDateDiffToCurrentDateInDays(lastDonationReminderDate);
-            return diffDays >= DONATION_REMINDER_DURATION;
-
-        } catch (ParseException e) {
+            FragmentTransaction fragmentTransaction = new FragmentManagerEnhanced(
+                    getActivity().getSupportFragmentManager()).removePreviousFragment(
+                    DonationReminderDialog.TAG);
+            DialogFragment newFragment = new DonationReminderDialog();
+            newFragment.setCancelable(false);
+            newFragment.show(fragmentTransaction, DonationReminderDialog.TAG);
+        } catch (IllegalStateException | NullPointerException e) {
             e.printStackTrace();
-            Log.e(TAG, e.getMessage());
-            return false;
         }
     }
-
 }
diff --git a/app/src/main/java/se/leap/bitmaskclient/fragments/DonationReminderDialog.java b/app/src/main/java/se/leap/bitmaskclient/fragments/DonationReminderDialog.java
new file mode 100644
index 0000000000000000000000000000000000000000..001d7e6c8286f96ed0606212af5499a16269ef72
--- /dev/null
+++ b/app/src/main/java/se/leap/bitmaskclient/fragments/DonationReminderDialog.java
@@ -0,0 +1,121 @@
+package se.leap.bitmaskclient.fragments;
+
+import android.app.Dialog;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v7.app.AlertDialog;
+import android.support.v7.app.AppCompatDialogFragment;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.Button;
+
+import java.text.ParseException;
+
+import butterknife.ButterKnife;
+import butterknife.InjectView;
+import se.leap.bitmaskclient.R;
+import se.leap.bitmaskclient.utils.DateHelper;
+import se.leap.bitmaskclient.utils.PreferenceHelper;
+
+import static se.leap.bitmaskclient.Constants.DONATION_REMINDER_DURATION;
+import static se.leap.bitmaskclient.Constants.DONATION_URL;
+import static se.leap.bitmaskclient.Constants.ENABLE_DONATION;
+import static se.leap.bitmaskclient.Constants.ENABLE_DONATION_REMINDER;
+import static se.leap.bitmaskclient.Constants.FIRST_TIME_USER_DATE;
+import static se.leap.bitmaskclient.Constants.LAST_DONATION_REMINDER_DATE;
+
+public class DonationReminderDialog extends AppCompatDialogFragment {
+
+    public final static String TAG = DonationReminderDialog.class.getName();
+    private static boolean isShown = false;
+
+    @InjectView(R.id.btnDonate)
+    Button btnDonate;
+
+    @InjectView(R.id.btnLater)
+    Button btnLater;
+
+    @Override
+    public void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+    }
+
+    @NonNull
+    @Override
+    public Dialog onCreateDialog(Bundle savedInstanceState) {
+        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
+        LayoutInflater inflater = getActivity().getLayoutInflater();
+        View view = inflater.inflate(R.layout.donation_reminder_dialog, null);
+        ButterKnife.inject(this, view);
+        isShown = true;
+
+        builder.setView(view);
+        btnDonate.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(DONATION_URL));
+                startActivity(browserIntent);
+                PreferenceHelper.putString(getContext(), LAST_DONATION_REMINDER_DATE,
+                        DateHelper.getCurrentDateString());
+                dismiss();
+            }
+        });
+        btnLater.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                PreferenceHelper.putString(getContext(), LAST_DONATION_REMINDER_DATE,
+                        DateHelper.getCurrentDateString());
+                dismiss();
+            }
+        });
+
+        return builder.create();
+    }
+
+    public static boolean isCallable(Context context) {
+        if (isShown) {
+            return false;
+        }
+
+        if (!ENABLE_DONATION || !ENABLE_DONATION_REMINDER) {
+            return false;
+        }
+
+        if (context == null) {
+            Log.e(TAG, "context is null!");
+            return false;
+        }
+
+        String firstTimeUserDate = PreferenceHelper.getString(context, FIRST_TIME_USER_DATE, null);
+        if (firstTimeUserDate == null) {
+            PreferenceHelper.putString(context, FIRST_TIME_USER_DATE, DateHelper.getCurrentDateString());
+            return false;
+        }
+
+        try {
+            long diffDays;
+
+            diffDays = DateHelper.getDateDiffToCurrentDateInDays(firstTimeUserDate);
+            if (diffDays < 1) {
+                return false;
+            }
+
+            String lastDonationReminderDate = PreferenceHelper.getString(context, LAST_DONATION_REMINDER_DATE, null);
+            if (lastDonationReminderDate == null) {
+                return true;
+            }
+            diffDays = DateHelper.getDateDiffToCurrentDateInDays(lastDonationReminderDate);
+            return diffDays >= DONATION_REMINDER_DURATION;
+
+        } catch (ParseException e) {
+            e.printStackTrace();
+            Log.e(TAG, e.getMessage());
+            return false;
+        }
+    }
+}
diff --git a/app/src/main/java/se/leap/bitmaskclient/utils/PreferenceHelper.java b/app/src/main/java/se/leap/bitmaskclient/utils/PreferenceHelper.java
index 12015dfb2feec455578109fdc1dff5e98fbc2b32..5f739ce1bd5dce50d7ed81c75ff5ab9bf9219829 100644
--- a/app/src/main/java/se/leap/bitmaskclient/utils/PreferenceHelper.java
+++ b/app/src/main/java/se/leap/bitmaskclient/utils/PreferenceHelper.java
@@ -1,5 +1,6 @@
 package se.leap.bitmaskclient.utils;
 
+import android.app.Activity;
 import android.content.Context;
 import android.content.SharedPreferences;
 import android.os.Looper;
@@ -239,4 +240,13 @@ public class PreferenceHelper {
         return result;
     }
 
+    public static String getString(Context context, String key, String defValue) {
+        SharedPreferences preferences = context.getSharedPreferences(SHARED_PREFERENCES, Context.MODE_PRIVATE);
+        return preferences.getString(key, defValue);
+    }
+
+    public static void putString(Context context, String key, String value){
+        SharedPreferences preferences = context.getSharedPreferences(SHARED_PREFERENCES, Context.MODE_PRIVATE);
+        preferences.edit().putString(key, value).apply();
+    }
 }
diff --git a/app/src/main/res/drawable/cust_button_primary.xml b/app/src/main/res/drawable/cust_button_primary.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3b0f7e26ab3d325190e07b9eaea1c88a7b02c492
--- /dev/null
+++ b/app/src/main/res/drawable/cust_button_primary.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android" >
+    <item android:state_pressed="true" >
+        <shape android:shape="rectangle"  >
+            <corners android:radius="50dp" />
+            <padding android:left="8dp" android:right="8dp"/>
+            <solid android:color="@color/colorPrimaryDark"/>
+        </shape>
+    </item>
+    <item android:state_focused="true">
+        <shape android:shape="rectangle"  >
+            <corners android:radius="50dp" />
+            <padding android:left="8dp" android:right="8dp"/>
+            <solid android:color="@color/colorPrimaryDark"/>
+        </shape>
+    </item>
+    <item >
+        <shape android:shape="rectangle"  >
+            <corners android:radius="50dp" />
+            <padding android:left="8dp" android:right="8dp"/>
+            <solid android:color="@color/colorPrimary"/>
+        </shape>
+    </item>
+</selector>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/cust_button_secondary.xml b/app/src/main/res/drawable/cust_button_secondary.xml
new file mode 100644
index 0000000000000000000000000000000000000000..553adca81f9290768b2f420da2736a6fe95fd34f
--- /dev/null
+++ b/app/src/main/res/drawable/cust_button_secondary.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android" >
+    <item android:state_pressed="true" >
+        <shape android:shape="rectangle"  >
+            <corners android:radius="50dp" />
+            <padding android:left="8dp" android:right="8dp"/>
+            <solid android:color="@android:color/transparent"/>
+            <stroke android:width="2dp" android:color="@color/colorPrimary"/>
+        </shape>
+    </item>
+    <item android:state_focused="true">
+        <shape android:shape="rectangle"  >
+            <corners android:radius="50dp" />
+            <padding android:left="8dp" android:right="8dp"/>
+            <solid android:color="@android:color/transparent"/>
+            <stroke android:width="2dp" android:color="@color/colorPrimary"/>
+        </shape>
+    </item>
+    <item >
+        <shape android:shape="rectangle"  >
+            <corners android:radius="50dp" />
+            <padding android:left="8dp" android:right="8dp"/>
+            <solid android:color="@android:color/transparent"/>
+            <stroke android:width="2dp" android:color="@color/colorPrimary"/>
+        </shape>
+    </item>
+</selector>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/donation_img.xml b/app/src/main/res/drawable/donation_img.xml
new file mode 100644
index 0000000000000000000000000000000000000000..1e0b405e4a24667a51900b6f799cec843d91d0de
--- /dev/null
+++ b/app/src/main/res/drawable/donation_img.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:drawable="@drawable/background_main"
+    android:gravity="fill_horizontal|fill_vertical"/>
+    <item android:drawable="@drawable/logo"
+        android:gravity="center"
+        />
+</layer-list>
diff --git a/app/src/main/res/layout/donation_reminder_dialog.xml b/app/src/main/res/layout/donation_reminder_dialog.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6b523053fc77013d8379d22e347bb7d8621c6b0d
--- /dev/null
+++ b/app/src/main/res/layout/donation_reminder_dialog.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:gravity="center"
+    android:orientation="vertical">
+
+    <TextView
+        android:id="@+id/tvTitle"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginBottom="@dimen/standard_margin"
+        android:layout_marginTop="@dimen/add_button_margin"
+        android:gravity="center"
+        android:text="@string/donate_title"
+        android:textAllCaps="true"
+        android:textColor="@color/colorPrimary"
+        android:textSize="28sp"
+        android:textStyle="bold" />
+
+    <TextView
+        android:id="@+id/tvMessage"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_margin="@dimen/standard_margin"
+        android:gravity="center"
+        android:text="@string/donate_message" />
+
+    <ImageView
+        android:id="@+id/ivImg"
+        android:layout_width="120dp"
+        android:layout_height="120dp"
+        android:layout_marginBottom="@dimen/add_button_margin"
+        android:layout_marginTop="@dimen/add_button_margin"
+        android:src="@drawable/donation_img" />
+
+    <Button
+        android:id="@+id/btnDonate"
+        android:layout_width="200dp"
+        android:layout_height="38dp"
+        android:layout_marginLeft="@dimen/add_button_margin"
+        android:layout_marginRight="@dimen/add_button_margin"
+        android:layout_marginTop="@dimen/standard_margin"
+        android:background="@drawable/cust_button_primary"
+        android:text="@string/donate_button_donate"
+        android:textColor="@color/white"
+        android:textStyle="bold" />
+
+    <Button
+        android:id="@+id/btnLater"
+        android:layout_width="200dp"
+        android:layout_height="38dp"
+        android:layout_marginBottom="@dimen/mainbutton_padding"
+        android:layout_marginLeft="@dimen/add_button_margin"
+        android:layout_marginRight="@dimen/add_button_margin"
+        android:layout_marginTop="@dimen/standard_margin"
+        android:background="@drawable/cust_button_secondary"
+        android:text="@string/donate_button_remind_later"
+        android:textColor="@android:color/tab_indicator_text"
+        android:textStyle="bold" />
+
+</LinearLayout>
\ No newline at end of file