diff --git a/bin/hpdf.pro b/bin/hpdf.pro
index fc6c862..d83005e 100644
--- a/bin/hpdf.pro
+++ b/bin/hpdf.pro
@@ -11,6 +11,8 @@ HEADERS += \
   ../src/pdf_page_widget.h \
   ../src/pdf_table_widget.h \
   ../src/pdf_file_widget.h \
+  ../src/pdf_jam.h \
+  ../src/thumbgen.h \
   ../src/pdf_preview_widget.h
 
 SOURCES += \
@@ -19,6 +21,8 @@ SOURCES += \
   ../src/pdf_page_widget.cpp \
   ../src/pdf_table_widget.cpp \
   ../src/pdf_file_widget.cpp \
+  ../src/pdf_jam.cpp \
+  ../src/thumbgen.cpp \
   ../src/pdf_preview_widget.cpp
 
 RESOURCES += hpdf.qrc
diff --git a/src/pdf_file_widget.cpp b/src/pdf_file_widget.cpp
index b15c9e1..385c360 100644
--- a/src/pdf_file_widget.cpp
+++ b/src/pdf_file_widget.cpp
@@ -101,6 +101,13 @@ PDFFileWidget::PDFFileWidget(QWidget* parent) {
   setLayout(topLayout);
 
   setCollapsed(false);
+
+  connect(&tgen, SIGNAL(updateThumbnail(QImage,PDFPageWidget*)), this,
+          SLOT(updateThumbnail(QImage,PDFPageWidget*)));
+}
+
+void PDFFileWidget::updateThumbnail(QImage img, PDFPageWidget* pw) {
+  pw->setThumbnail(img);
 }
 
 void PDFFileWidget::setCollapsed(bool state) {
@@ -118,20 +125,28 @@ void PDFFileWidget::collapsedButtonClick(void) {
   setCollapsed(!collapsed);
 }
 
+void PDFFileWidget::pageClickedHandler(QMouseEvent*, QImage) {
+
+}
+
 void PDFFileWidget::setDocument(Poppler::Document* document, QString fileName) {
+  document->setRenderHint(Poppler::Document::TextAntialiasing);
   int numPages = document->numPages();
   for(int i = 0; i < numPages; i++) {
     Poppler::Page* pdfPage = document->page(i);
 
-    QImage pageImage = pdfPage->renderToImage(144, 144);
-
     PDFPageWidget* pageWidget = new PDFPageWidget();
-    pageWidget->setThumbnail(pageImage);
+    
+    tgen.render(pageWidget, pdfPage);
+
     connect(pageWidget, SIGNAL(pageClicked(QMouseEvent*,QImage)), this,
             SIGNAL(pageClicked(QMouseEvent*,QImage)));
 
     pagesContainerWidget->addPageWidget(pageWidget);
+    /* Process event. */
+    /*qApp->processEvents();*/
   }
+  tgen.start();
   fileNameLabel->setText(fileName);
 }
 
diff --git a/src/pdf_file_widget.h b/src/pdf_file_widget.h
index 300fe19..8ecd162 100644
--- a/src/pdf_file_widget.h
+++ b/src/pdf_file_widget.h
@@ -2,6 +2,7 @@
 #include <QWidget>
 #include <poppler-qt5.h>
 #include "pdf_page_widget.h"
+#include "thumbgen.h"
 
 class QImage;
 class QHBoxLayout;
@@ -16,6 +17,7 @@ class QDragEnterEvent;
 class QDropEvent;
 class QMouseEvent;
 class PDFPageWidget;
+class ThumbGen;
 
 class PagesContainerWidget : public QWidget {
   Q_OBJECT
@@ -56,9 +58,12 @@ protected:
 
 private slots:
   void collapsedButtonClick();
+  void pageClickedHandler(QMouseEvent*, QImage);
+  void updateThumbnail(QImage, PDFPageWidget*);
 
 private:
-  QGridLayout* topLayout;
+  ThumbGen                tgen;
+  QGridLayout*            topLayout;
 
   QLabel*                 fileNameLabel;
   QPushButton*            collapseButton;
@@ -69,5 +74,6 @@ private:
 
 signals:
   void pageClicked(QMouseEvent*, QImage);
+  void pageClicked(QMouseEvent*, Poppler::Page*);
 };
 
diff --git a/src/pdf_jam.cpp b/src/pdf_jam.cpp
new file mode 100644
index 0000000..236a734
--- /dev/null
+++ b/src/pdf_jam.cpp
@@ -0,0 +1,24 @@
+#include <QtGlobal>
+#include <QtWidgets>
+#include <unistd.h>
+#include <stdlib.h>
+#include "pdf_jam.h"
+
+PDFJam::PDFJam(void) {
+  
+}
+
+void PDFJam::run(void) {
+#if 0
+  if((pid = fork()) < 0) {
+    
+  }
+  else if(pid > 0) {
+    /* Parent. */
+  } else {
+    /* Child. */
+    system("echo 'tata' > /tmp/test.txt");
+  }
+#endif
+}
+
diff --git a/src/pdf_jam.h b/src/pdf_jam.h
new file mode 100644
index 0000000..548f9fd
--- /dev/null
+++ b/src/pdf_jam.h
@@ -0,0 +1,14 @@
+#pragma once
+
+class PDFJam { /*:public QThread {*/
+public:
+  PDFJam(void);
+
+protected:
+  void run(void);
+
+private:
+  volatile bool stopped;
+
+};
+
diff --git a/src/thumbgen.cpp b/src/thumbgen.cpp
new file mode 100644
index 0000000..e44f000
--- /dev/null
+++ b/src/thumbgen.cpp
@@ -0,0 +1,45 @@
+#include <QtGlobal>
+#include <QtWidgets>
+#include "thumbgen.h"
+#include "pdf_page_widget.h"
+
+ThumbGen::ThumbGen(void) {
+  
+}
+
+double ThumbGen::calcDpi(Poppler::Page* pdfPage, QSize targetSize) {
+  double dpi;
+  QSizeF oriSize = pdfPage->pageSizeF();
+  double oriDpi = 72;
+
+  if(targetSize.width() > targetSize.height()) {
+    dpi = targetSize.height() / (float)oriSize.height()*72;
+  } else {
+    dpi = targetSize.width() / (float)oriSize.width()*72;
+  }
+
+  return dpi;
+}
+
+void ThumbGen::run(void) {
+  while(pWidgets.size() != 0) {
+    mutex.lock();
+    PDFPageWidget* pw = pWidgets.first();
+    pWidgets.pop_front();
+    Poppler::Page* pp = pPages.last();
+    pPages.pop_front();
+    mutex.unlock();
+
+    double dpi = calcDpi(pp, pw->size());
+    QImage pageImage = pp->renderToImage(dpi, dpi);
+    emit updateThumbnail(pageImage, pw);
+  }
+}
+
+void ThumbGen::render(PDFPageWidget* pw, Poppler::Page* pp) {
+  mutex.lock();
+  pWidgets.append(pw);
+  pPages.append(pp);
+  mutex.unlock();
+}
+
diff --git a/src/thumbgen.h b/src/thumbgen.h
new file mode 100644
index 0000000..d758923
--- /dev/null
+++ b/src/thumbgen.h
@@ -0,0 +1,30 @@
+#pragma once
+#include <QThread>
+#include <QMutex>
+#include <QImage>
+#include <poppler-qt5.h>
+
+class PDFPageWidget;
+class QImage;
+
+class ThumbGen : public QThread {
+  Q_OBJECT
+public:
+  ThumbGen(void);
+  void render(PDFPageWidget*, Poppler::Page*);
+
+protected:
+  void run(void);
+  QVector<PDFPageWidget*> pWidgets;
+  QVector<Poppler::Page*> pPages;
+
+  QMutex mutex;
+
+private:
+  double calcDpi(Poppler::Page* pdfPage, QSize targetSize);
+
+signals:
+  void updateThumbnail(QImage, PDFPageWidget*);
+
+};
+