diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/database/ComicsDAO.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/database/ComicsDAO.java
index dae5aa329d509c06f169a1e0f9b649b99afc0157..8abcfc6b72f96d81bcf491c67e42e34e8ed0d632 100644
--- a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/database/ComicsDAO.java
+++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/database/ComicsDAO.java
@@ -18,6 +18,9 @@ public interface ComicsDAO {
     @Query("SELECT * FROM ComicStrip WHERE id = :id")
     public ComicStrip getComic(Long id);
 
+    @Query("SELECT * FROM ComicStrip WHERE num = :num")
+    public ComicStrip getComicByNum(Long num);
+
     @Insert
     public void insertAll(ComicStrip... comic);
 
diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/interactor/comics/ComicsInteractor.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/interactor/comics/ComicsInteractor.java
index f333e97456b37c3624d2453b44f40cd416199f66..5e7ffe22fcf48414972764730f11e5a678e3e738 100644
--- a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/interactor/comics/ComicsInteractor.java
+++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/interactor/comics/ComicsInteractor.java
@@ -2,8 +2,6 @@ package me.szaki.xkcd.xkcdbrowser.interactor.comics;
 
 
 import java.io.IOException;
-import java.util.Date;
-import java.util.Random;
 
 import javax.inject.Inject;
 
@@ -23,12 +21,8 @@ public class ComicsInteractor {
         return this.comicApi.getComic(id).execute().body();
     }
 
-    public Comic getRandomComic() throws IOException {
-        Random r = new Random(new Date().getTime());
-        return this.comicApi.getComic(r.nextLong()).execute().body();
-    }
-
     public Comic getLatestComic() throws IOException {
         return this.comicApi.getCurrentComic().execute().body();
     }
+
 }
diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/interactor/comics/DBInteractor.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/interactor/comics/DBInteractor.java
index 47a7a0f4c8fe684ec6d2dcbe28fe6b5a1af958c9..733be6773cd3284f40b98b1d7f7164d5643dabe4 100644
--- a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/interactor/comics/DBInteractor.java
+++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/interactor/comics/DBInteractor.java
@@ -34,5 +34,6 @@ public class DBInteractor {
         db.getDAO().insertAll(c);
     }
 
+    public ComicStrip getComicByNum(Long id) { return db.getDAO().getComicByNum(id); }
 
 }
diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/main/MainActivity.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/main/MainActivity.java
index 5904221b9041219216fa821ade86863e24a950a1..98944f2249b5f9431e5ef761228db58426922d0c 100644
--- a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/main/MainActivity.java
+++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/main/MainActivity.java
@@ -1,6 +1,10 @@
 package me.szaki.xkcd.xkcdbrowser.ui.main;
 
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.net.Uri;
 import android.os.Bundle;
+import android.os.Handler;
 import android.support.design.widget.FloatingActionButton;
 import android.support.design.widget.Snackbar;
 import android.view.View;
@@ -12,14 +16,35 @@ import android.support.v7.app.AppCompatActivity;
 import android.support.v7.widget.Toolbar;
 import android.view.Menu;
 import android.view.MenuItem;
+import android.widget.ImageButton;
+import android.widget.ImageView;
+import android.widget.Toast;
+
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import javax.inject.Inject;
 
 import me.szaki.xkcd.xkcdbrowser.R;
+import me.szaki.xkcd.xkcdbrowser.XKCDBrowserApplication;
+import me.szaki.xkcd.xkcdbrowser.network.model.Comic;
 
 public class MainActivity extends AppCompatActivity
-        implements NavigationView.OnNavigationItemSelectedListener {
+        implements NavigationView.OnNavigationItemSelectedListener, MainScreen {
+
+    @Inject
+    MainPresenter mainPresenter;
+
+    private ImageView imageView;
+    private Comic currentComic;
+    private ImageButton favoriteButton;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
+        XKCDBrowserApplication.injector.inject(this);
+
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
         Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
@@ -33,6 +58,41 @@ public class MainActivity extends AppCompatActivity
 
         NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
         navigationView.setNavigationItemSelectedListener(this);
+        
+        findViewById(R.id.favorite_button).setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                favoriteButton.setClickable(false);
+                mainPresenter.saveComic(currentComic);
+            }
+        });
+
+        this.imageView = findViewById(R.id.imageView);
+        this.favoriteButton = findViewById(R.id.favorite_button);
+
+        findViewById(R.id.next_button).setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                favoriteButton.setClickable(false);
+                mainPresenter.getNext();
+            }
+        });
+
+        findViewById(R.id.previous_button).setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                favoriteButton.setClickable(false);
+                mainPresenter.getPrevious();
+            }
+        });
+
+        findViewById(R.id.random_button).setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                favoriteButton.setClickable(false);
+                mainPresenter.getRandom();
+            }
+        });
     }
 
     @Override
@@ -61,4 +121,77 @@ public class MainActivity extends AppCompatActivity
         drawer.closeDrawer(GravityCompat.START);
         return true;
     }
+
+    @Override
+    protected void onStart() {
+        super.onStart();
+
+        this.mainPresenter.attachScreen(this);
+        this.mainPresenter.getCurrent();
+    }
+
+    @Override
+    protected void onStop() {
+        super.onStop();
+
+        this.mainPresenter.detachScreen();
+    }
+
+    @Override
+    public void getImage(final Comic c) {
+        Handler mainHandler = new Handler(getApplicationContext().getMainLooper());
+        Bitmap mIcon_val = null;
+
+        if (c != null) {
+            currentComic = c;
+            try {
+                URL newurl = new URL(c.getImg());
+                mIcon_val = BitmapFactory.decodeStream(newurl.openConnection().getInputStream());
+            } catch (MalformedURLException e) {
+                e.printStackTrace();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+
+        final Bitmap finalMIcon_val = mIcon_val;
+        Runnable myRunnable = new Runnable() {
+            @Override
+            public void run() {
+                if (finalMIcon_val == null) {
+                    Snackbar.make(findViewById(android.R.id.content), "Already on newest!", Snackbar.LENGTH_SHORT)
+                            .setAction("Action", null).show();
+                } else {
+                    imageView.setImageBitmap(finalMIcon_val);
+                }
+            }
+        };
+        mainHandler.post(myRunnable);
+    }
+
+    @Override
+    public void saveComic() {
+        Handler mainHandler = new Handler(getApplicationContext().getMainLooper());
+
+        Runnable myRunnable = new Runnable() {
+            @Override
+            public void run() {
+                favoriteButton.setImageDrawable(getDrawable(R.drawable.ic_star));
+                Snackbar.make(findViewById(android.R.id.content), "Saved!", Snackbar.LENGTH_SHORT)
+                    .setAction("Action", null).show();
+            }
+        };
+        mainHandler.post(myRunnable);
+    }
+
+    @Override
+    public void setFavorite(boolean exists) {
+
+        if (exists) {
+            favoriteButton.setImageDrawable(getDrawable(R.drawable.ic_star));
+        } else {
+            favoriteButton.setImageDrawable(getDrawable(R.drawable.ic_star_border));
+            favoriteButton.setClickable(true);
+        }
+    }
 }
diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/main/MainPresenter.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/main/MainPresenter.java
index 23edcd5a9ff9f604b53a42e7816256d8f7056c6e..8532aabd3d936e2aa15bd5f17305e46a7a9f3425 100644
--- a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/main/MainPresenter.java
+++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/main/MainPresenter.java
@@ -1,11 +1,18 @@
 package me.szaki.xkcd.xkcdbrowser.ui.main;
 
 
+import android.support.annotation.Nullable;
+
+import java.io.IOException;
+import java.util.Random;
+
 import javax.inject.Inject;
 
 import me.szaki.xkcd.xkcdbrowser.XKCDBrowserApplication;
 import me.szaki.xkcd.xkcdbrowser.interactor.comics.ComicsInteractor;
 import me.szaki.xkcd.xkcdbrowser.interactor.comics.DBInteractor;
+import me.szaki.xkcd.xkcdbrowser.model.ComicStrip;
+import me.szaki.xkcd.xkcdbrowser.network.model.Comic;
 import me.szaki.xkcd.xkcdbrowser.ui.Presenter;
 
 public class MainPresenter extends Presenter<MainScreen> {
@@ -15,17 +22,112 @@ public class MainPresenter extends Presenter<MainScreen> {
     @Inject
     DBInteractor db;
 
-    public MainPresenter () {
+    private int currentId;
+    private int maxId;
+
+    private Random r;
+
+    public MainPresenter() {
         XKCDBrowserApplication.injector.inject(this);
+        r = new Random();
     }
 
-    @Override
-    public void attachScreen(MainScreen screen) {
-        super.attachScreen(screen);
+    public void getCurrent() {
+        new Thread() {
+            @Override
+            public void run() {
+                try {
+                    Comic c = comicsInteractor.getLatestComic();
+                    currentId = c.getNum();
+                    maxId = c.getNum();
+                    screen.getImage(c);
+                    checkFavorite(c);
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }.start();
     }
 
-    @Override
-    public void detachScreen() {
-        super.detachScreen();
+    public void getPrevious() {
+        new Thread() {
+            @Override
+            public void run() {
+                Comic c = getComic(--currentId);
+                screen.getImage(c);
+                checkFavorite(c);
+            }
+        }.start();
     }
+
+    public void getRandom() {
+        new Thread() {
+            @Override
+            public void run() {
+                Comic c = getComic(r.nextInt(maxId));
+                currentId = c.getNum();
+                screen.getImage(c);
+                checkFavorite(c);
+            }
+        }.start();
+    }
+
+    public void getNext() {
+        new Thread() {
+            @Override
+            public void run() {
+                Comic c = getComic(++currentId);
+                if (c != null && c.getNum() > maxId) {
+                    maxId = c.getNum();
+                }
+                screen.getImage(c);
+                checkFavorite(c);
+            }
+        }.start();
+    }
+
+    public void saveComic(final Comic currentComic) {
+        new Thread() {
+            @Override
+            public void run() {
+                ComicStrip comic = new ComicStrip() {{
+                    setAlt(currentComic.getAlt());
+                    setDay(currentComic.getDay());
+                    setMonth(currentComic.getMonth());
+                    setNum(Long.valueOf(currentComic.getNum()));
+                    setLink(currentComic.getLink());
+                    setYear(currentComic.getYear());
+                    setNews(currentComic.getNews());
+                    setSafe_title(currentComic.getSafeTitle());
+                    setTranscript(currentComic.getTranscript());
+                    setImg(currentComic.getImg());
+                    setTitle(currentComic.getTitle());
+                }};
+
+                db.saveComic(comic);
+                screen.saveComic();
+            }
+        }.start();
+    }
+
+    @Nullable
+    private Comic getComic(int id) {
+        try {
+            Comic c = comicsInteractor.getComic(id);
+            return c;
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    private void checkFavorite(Comic c) {
+        if (c == null) {
+            return;
+        }
+        ComicStrip comicByNum = db.getComicByNum(c.getNum().longValue());
+        screen.setFavorite(comicByNum != null);
+    }
+
 }
+
diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/main/MainScreen.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/main/MainScreen.java
index 4990c7658b6fd903d6092c3cddb60f120bf652ee..e77fdf9d3e92d112e36ca8f551e4482eb04b0cf5 100644
--- a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/main/MainScreen.java
+++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/main/MainScreen.java
@@ -1,4 +1,11 @@
 package me.szaki.xkcd.xkcdbrowser.ui.main;
 
+import me.szaki.xkcd.xkcdbrowser.network.model.Comic;
+
 public interface MainScreen {
+    public void getImage(Comic c);
+
+    public void saveComic();
+
+    public void setFavorite(boolean exists);
 }
diff --git a/app/src/main/res/layout/app_bar_main.xml b/app/src/main/res/layout/app_bar_main.xml
index b10e6c4aa7db489813b2340c3dac0254ca118425..54bfacb0d575db66b22e5ad95a050aeec405c7e4 100644
--- a/app/src/main/res/layout/app_bar_main.xml
+++ b/app/src/main/res/layout/app_bar_main.xml
@@ -25,7 +25,7 @@
                 android:orientation="vertical">
 
                 <ImageButton
-                    android:id="@+id/imageButton"
+                    android:id="@+id/favorite_button"
                     android:layout_width="50dp"
                     android:layout_height="wrap_content"
                     android:adjustViewBounds="false"
@@ -33,7 +33,8 @@
                     android:cropToPadding="false"
                     android:padding="10dp"
                     android:scaleType="centerInside"
-                    app:srcCompat="@drawable/ic_star" />
+                    app:srcCompat="@drawable/ic_star_border"
+                    android:clickable="false"/>
 
 
             </LinearLayout>