diff --git a/app/build.gradle b/app/build.gradle
index 0d296d8b70a1e230065a5f22a5a44dc4c75007f0..cce474a80c18f3568fee16326eba7b245cedf417 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -31,8 +31,19 @@ android {
 dependencies {
     implementation fileTree(dir: 'libs', include: ['*.jar'])
     implementation 'com.android.support:appcompat-v7:26.1.0'
+    implementation 'com.android.support:support-v4:26.1.0'
+    implementation 'com.android.support:design:26.1.0'
     implementation 'com.android.support.constraint:constraint-layout:1.0.2'
     testImplementation 'junit:junit:4.12'
     androidTestImplementation 'com.android.support.test:runner:1.0.1'
     androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
+
+    // Dagger
+    implementation 'com.google.dagger:dagger:2.11'
+    implementation 'com.google.dagger:dagger-android-support:2.11' // if you use the support libraries
+    annotationProcessor 'com.google.dagger:dagger-compiler:2.11'
+    annotationProcessor 'com.google.dagger:dagger-android-processor:2.11'
+    implementation 'com.google.dagger:dagger-android:2.11'
+    compileOnly 'javax.annotation:jsr250-api:1.0'
 }
+
diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/MainActivity.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/MainActivity.java
deleted file mode 100644
index 090ccda6e2f4128f721ad21dfdd216fd8ceae5bb..0000000000000000000000000000000000000000
--- a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/MainActivity.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package me.szaki.xkcd.xkcdbrowser;
-
-import android.support.v7.app.AppCompatActivity;
-import android.os.Bundle;
-
-public class MainActivity extends AppCompatActivity {
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.activity_main);
-    }
-}
diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/XKCDBrowserApplication.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/XKCDBrowserApplication.java
new file mode 100644
index 0000000000000000000000000000000000000000..dc11a728393dfb9e6272e6f4362fe9e510c65552
--- /dev/null
+++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/XKCDBrowserApplication.java
@@ -0,0 +1,15 @@
+package me.szaki.xkcd.xkcdbrowser;
+
+import android.app.Application;
+
+import me.szaki.xkcd.xkcdbrowser.ui.UIModule;
+
+public class XKCDBrowserApplication extends Application {
+    public static XKCDBrowserApplicationComponent injector;
+
+    @Override
+    public void onCreate() {
+        super.onCreate();
+        injector = DaggerXKCDBrowserApplicationComponent.builder().uIModule(new UIModule(this)).build();
+    }
+}
diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/XKCDBrowserApplicationComponent.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/XKCDBrowserApplicationComponent.java
new file mode 100644
index 0000000000000000000000000000000000000000..baf10132a8f6c4734546f382637543a31353f623
--- /dev/null
+++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/XKCDBrowserApplicationComponent.java
@@ -0,0 +1,25 @@
+package me.szaki.xkcd.xkcdbrowser;
+
+
+import javax.inject.Singleton;
+
+import dagger.Component;
+import me.szaki.xkcd.xkcdbrowser.interactor.InteractorModule;
+import me.szaki.xkcd.xkcdbrowser.interactor.comics.ComicsInteractor;
+import me.szaki.xkcd.xkcdbrowser.ui.UIModule;
+import me.szaki.xkcd.xkcdbrowser.ui.detail.DetailActivity;
+import me.szaki.xkcd.xkcdbrowser.ui.favorites.FavoritesActivity;
+import me.szaki.xkcd.xkcdbrowser.ui.main.MainActivity;
+
+@Singleton
+@Component(modules = {UIModule.class, InteractorModule.class})
+public interface XKCDBrowserApplicationComponent {
+
+    void inject(MainActivity mainActivity);
+
+    void inject(DetailActivity detailActivity);
+
+    void inject(FavoritesActivity favoritesActivity);
+
+    void inject(ComicsInteractor comicsInteractor);
+}
diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/interactor/InteractorModule.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/interactor/InteractorModule.java
new file mode 100644
index 0000000000000000000000000000000000000000..de0c2172c2d5dde915f04c4f4a62d2d9c42b7962
--- /dev/null
+++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/interactor/InteractorModule.java
@@ -0,0 +1,13 @@
+package me.szaki.xkcd.xkcdbrowser.interactor;
+
+import dagger.Module;
+import dagger.Provides;
+import me.szaki.xkcd.xkcdbrowser.interactor.comics.ComicsInteractor;
+
+@Module
+public class InteractorModule {
+    @Provides
+    public ComicsInteractor provideComicsInteractor() {
+        return new ComicsInteractor();
+    }
+}
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
new file mode 100644
index 0000000000000000000000000000000000000000..30603ccaa0156bc1197e5d322647ae854fa7d9d3
--- /dev/null
+++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/interactor/comics/ComicsInteractor.java
@@ -0,0 +1,10 @@
+package me.szaki.xkcd.xkcdbrowser.interactor.comics;
+
+
+import me.szaki.xkcd.xkcdbrowser.XKCDBrowserApplication;
+
+public class ComicsInteractor {
+    public ComicsInteractor() {
+        XKCDBrowserApplication.injector.inject(this);
+    }
+}
diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/Presenter.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/Presenter.java
new file mode 100644
index 0000000000000000000000000000000000000000..9a124a48fba537e7a372e6bf3689f8b62eb0eeab
--- /dev/null
+++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/Presenter.java
@@ -0,0 +1,13 @@
+package me.szaki.xkcd.xkcdbrowser.ui;
+
+public abstract class Presenter<S> {
+    protected S screen;
+
+    public void attachScreen(S screen) {
+        this.screen = screen;
+    }
+
+    public void detachScreen() {
+        this.screen = null;
+    }
+}
diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/UIModule.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/UIModule.java
new file mode 100644
index 0000000000000000000000000000000000000000..b4b6b791da5a88154b4198f5f0ff64d22be66191
--- /dev/null
+++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/UIModule.java
@@ -0,0 +1,44 @@
+package me.szaki.xkcd.xkcdbrowser.ui;
+
+import android.content.Context;
+
+import javax.inject.Singleton;
+
+import dagger.Module;
+import dagger.Provides;
+import me.szaki.xkcd.xkcdbrowser.ui.detail.DetailPresenter;
+import me.szaki.xkcd.xkcdbrowser.ui.favorites.FavoritesPresenter;
+import me.szaki.xkcd.xkcdbrowser.ui.main.MainPresenter;
+
+@Module
+public class UIModule {
+    private Context context;
+
+    public UIModule(Context context) {
+        this.context = context;
+    }
+
+    @Provides
+    public Context provideContext() {
+        return context;
+    }
+
+    @Provides
+    @Singleton
+    public MainPresenter provideMainPresenter() {
+        return new MainPresenter();
+    }
+
+    @Provides
+    @Singleton
+    public DetailPresenter provideDetailPresenter() {
+     return new DetailPresenter();
+    }
+
+    @Provides
+    @Singleton
+    public FavoritesPresenter provideFavoritesPresenter() {
+        return new FavoritesPresenter();
+    }
+
+}
diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/detail/DetailActivity.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/detail/DetailActivity.java
new file mode 100644
index 0000000000000000000000000000000000000000..88053321a0cb1f6a330dc9b9be9bf42b135b5bc6
--- /dev/null
+++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/detail/DetailActivity.java
@@ -0,0 +1,35 @@
+package me.szaki.xkcd.xkcdbrowser.ui.detail;
+
+
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+
+import javax.inject.Inject;
+
+import me.szaki.xkcd.xkcdbrowser.R;
+import me.szaki.xkcd.xkcdbrowser.XKCDBrowserApplication;
+
+public class DetailActivity extends AppCompatActivity implements DetailScreen {
+    @Inject
+    DetailPresenter detailPresenter;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_detail);
+
+        XKCDBrowserApplication.injector.inject(this);
+    }
+
+    @Override
+    protected void onStart() {
+        super.onStart();
+        detailPresenter.attachScreen(this);
+    }
+
+    @Override
+    protected void onStop() {
+        super.onStop();
+        detailPresenter.detachScreen();
+    }
+}
diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/detail/DetailPresenter.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/detail/DetailPresenter.java
new file mode 100644
index 0000000000000000000000000000000000000000..130f5a50d4e8ca7af4561320c5b6f7d70be59a63
--- /dev/null
+++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/detail/DetailPresenter.java
@@ -0,0 +1,22 @@
+package me.szaki.xkcd.xkcdbrowser.ui.detail;
+
+
+import javax.inject.Inject;
+
+import me.szaki.xkcd.xkcdbrowser.interactor.comics.ComicsInteractor;
+import me.szaki.xkcd.xkcdbrowser.ui.Presenter;
+
+public class DetailPresenter extends Presenter<DetailScreen> {
+    @Inject
+    ComicsInteractor comicsInteractor;
+
+    @Override
+    public void attachScreen(DetailScreen screen) {
+        super.attachScreen(screen);
+    }
+
+    @Override
+    public void detachScreen() {
+        super.detachScreen();
+    }
+}
diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/detail/DetailScreen.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/detail/DetailScreen.java
new file mode 100644
index 0000000000000000000000000000000000000000..9c33c64924b67d5037eed407a5c7488643467d07
--- /dev/null
+++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/detail/DetailScreen.java
@@ -0,0 +1,4 @@
+package me.szaki.xkcd.xkcdbrowser.ui.detail;
+
+public interface DetailScreen {
+}
diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/favorites/FavoritesActivity.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/favorites/FavoritesActivity.java
new file mode 100644
index 0000000000000000000000000000000000000000..e1c52712267f44ceb24233fade9984c0a5110c69
--- /dev/null
+++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/favorites/FavoritesActivity.java
@@ -0,0 +1,35 @@
+package me.szaki.xkcd.xkcdbrowser.ui.favorites;
+
+
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+
+import javax.inject.Inject;
+
+import me.szaki.xkcd.xkcdbrowser.R;
+import me.szaki.xkcd.xkcdbrowser.XKCDBrowserApplication;
+
+public class FavoritesActivity extends AppCompatActivity implements FavoritesScreen {
+    @Inject
+    FavoritesPresenter favoritesPresenter;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_favorites);
+
+        XKCDBrowserApplication.injector.inject(this);
+    }
+
+    @Override
+    protected void onStart() {
+        super.onStart();
+        favoritesPresenter.attachScreen(this);
+    }
+
+    @Override
+    protected void onStop() {
+        super.onStop();
+        favoritesPresenter.detachScreen();
+    }
+}
diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/favorites/FavoritesPresenter.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/favorites/FavoritesPresenter.java
new file mode 100644
index 0000000000000000000000000000000000000000..87d4db82d3a4d0a2d2c866d9cf1a83f6636b3779
--- /dev/null
+++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/favorites/FavoritesPresenter.java
@@ -0,0 +1,22 @@
+package me.szaki.xkcd.xkcdbrowser.ui.favorites;
+
+
+import javax.inject.Inject;
+
+import me.szaki.xkcd.xkcdbrowser.interactor.comics.ComicsInteractor;
+import me.szaki.xkcd.xkcdbrowser.ui.Presenter;
+
+public class FavoritesPresenter extends Presenter<FavoritesScreen> {
+    @Inject
+    ComicsInteractor comicsInteractor;
+
+    @Override
+    public void attachScreen(FavoritesScreen screen) {
+        super.attachScreen(screen);
+    }
+
+    @Override
+    public void detachScreen() {
+        super.detachScreen();
+    }
+}
diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/favorites/FavoritesScreen.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/favorites/FavoritesScreen.java
new file mode 100644
index 0000000000000000000000000000000000000000..691e7d763c80a741a754df0c94a572bfc915a4cb
--- /dev/null
+++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/favorites/FavoritesScreen.java
@@ -0,0 +1,5 @@
+package me.szaki.xkcd.xkcdbrowser.ui.favorites;
+
+
+public interface FavoritesScreen {
+}
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
new file mode 100644
index 0000000000000000000000000000000000000000..44ee581f349aff30816f1510d29221521b3821b5
--- /dev/null
+++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/main/MainActivity.java
@@ -0,0 +1,34 @@
+package me.szaki.xkcd.xkcdbrowser.ui.main;
+
+import android.support.v7.app.AppCompatActivity;
+import android.os.Bundle;
+
+import javax.inject.Inject;
+
+import me.szaki.xkcd.xkcdbrowser.R;
+import me.szaki.xkcd.xkcdbrowser.XKCDBrowserApplication;
+
+public class MainActivity extends AppCompatActivity implements MainScreen {
+    @Inject
+    MainPresenter mainPresenter;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_main);
+
+        XKCDBrowserApplication.injector.inject(this);
+    }
+
+    @Override
+    protected void onStart() {
+        super.onStart();
+        mainPresenter.attachScreen(this);
+    }
+
+    @Override
+    protected void onStop() {
+        super.onStop();
+        mainPresenter.detachScreen();
+    }
+}
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
new file mode 100644
index 0000000000000000000000000000000000000000..1dcf930fc6d42073aa1250efd01a66f314f5c6eb
--- /dev/null
+++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/main/MainPresenter.java
@@ -0,0 +1,22 @@
+package me.szaki.xkcd.xkcdbrowser.ui.main;
+
+
+import javax.inject.Inject;
+
+import me.szaki.xkcd.xkcdbrowser.interactor.comics.ComicsInteractor;
+import me.szaki.xkcd.xkcdbrowser.ui.Presenter;
+
+public class MainPresenter extends Presenter<MainScreen> {
+    @Inject
+    ComicsInteractor comicsInteractor;
+
+    @Override
+    public void attachScreen(MainScreen screen) {
+        super.attachScreen(screen);
+    }
+
+    @Override
+    public void detachScreen() {
+        super.detachScreen();
+    }
+}
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
new file mode 100644
index 0000000000000000000000000000000000000000..4990c7658b6fd903d6092c3cddb60f120bf652ee
--- /dev/null
+++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/main/MainScreen.java
@@ -0,0 +1,4 @@
+package me.szaki.xkcd.xkcdbrowser.ui.main;
+
+public interface MainScreen {
+}
diff --git a/app/src/main/res/layout/activity_detail.xml b/app/src/main/res/layout/activity_detail.xml
new file mode 100644
index 0000000000000000000000000000000000000000..43febafe7eab8c820972e8f95ec0bf959b643d4f
--- /dev/null
+++ b/app/src/main/res/layout/activity_detail.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context="me.szaki.xkcd.xkcdbrowser.ui.detail.DetailActivity">
+
+</android.support.constraint.ConstraintLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_favorites.xml b/app/src/main/res/layout/activity_favorites.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5596ce04683d3f097b1bd9adca0fe6062b827905
--- /dev/null
+++ b/app/src/main/res/layout/activity_favorites.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context="me.szaki.xkcd.xkcdbrowser.ui.favorites.FavoritesActivity">
+
+</android.support.constraint.ConstraintLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 5d615661825dec99ccaa92a2d6102674f8eaeb9e..e25f1fe4f3260a7b5c8fd4cbe6ded0deb8274d70 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -4,7 +4,7 @@
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    tools:context="me.szaki.xkcd.xkcdbrowser.MainActivity">
+    tools:context="me.szaki.xkcd.xkcdbrowser.ui.main.MainActivity">
 
     <TextView
         android:layout_width="wrap_content"