diff --git a/src/qtlibtorrent/torrentmodel.cpp b/src/qtlibtorrent/torrentmodel.cpp
index 4356cdd..3c2458c 100644
--- a/src/qtlibtorrent/torrentmodel.cpp
+++ b/src/qtlibtorrent/torrentmodel.cpp
@@ -166,26 +166,72 @@ QIcon TorrentModelItem::getIconByState(State state) {
 }
 
 QColor TorrentModelItem::getColorByState(State state) {
+  static bool read = false;
+  static QColor down(34, 139, 34);
+  static QColor up(0, 0, 139);
+  static QColor paused(250, 128, 114);
+  static QColor stalledDown(0, 0, 0);
+  static QColor stalledUp(0, 0, 0);
+  static QColor queuedDown(0, 128, 128);
+  static QColor queuedUp(0, 128, 128);
+
+  if (!read) {
+    read = true;
+    QFile file("colors.txt");
+
+    if (file.open(QIODevice::ReadOnly|QIODevice::Text)) {
+      QTextStream str(&file);
+      while (!str.atEnd()) {
+        QString line = str.readLine();
+        int index = line.indexOf("=");
+        if (index == -1)
+          continue;
+
+        QString category = line.left(index);
+        QStringList rgb = line.mid(index+1).split(',', QString::SkipEmptyParts);
+        if (rgb.size() != 3)
+          continue;
+
+        if (category == "Downloading")
+          down.setRgb(rgb[0].toInt(), rgb[1].toInt(), rgb[2].toInt());
+        else if (category == "Seeding")
+          up.setRgb(rgb[0].toInt(), rgb[1].toInt(), rgb[2].toInt());
+        else if (category == "Paused")
+          paused.setRgb(rgb[0].toInt(), rgb[1].toInt(), rgb[2].toInt());
+        else if (category == "stalledDown")
+          stalledDown.setRgb(rgb[0].toInt(), rgb[1].toInt(), rgb[2].toInt());
+        else if (category == "stalledUp")
+          stalledUp.setRgb(rgb[0].toInt(), rgb[1].toInt(), rgb[2].toInt());
+        else if (category == "queuedDown")
+          queuedDown.setRgb(rgb[0].toInt(), rgb[1].toInt(), rgb[2].toInt());
+        else if (category == "queuedUp")
+          queuedUp.setRgb(rgb[0].toInt(), rgb[1].toInt(), rgb[2].toInt());
+      }
+    }
+  }
+
   switch (state) {
   case STATE_DOWNLOADING:
   case STATE_DOWNLOADING_META:
-    return QColor(0, 128, 0); // green
+    return down;
   case STATE_ALLOCATING:
   case STATE_STALLED_DL:
+    return stalledDown;
   case STATE_STALLED_UP:
-    return QColor(128, 128, 128); // grey
+    return stalledUp;
   case STATE_SEEDING:
-    return QColor(255, 165, 0); // orange
+    return up;
   case STATE_PAUSED_DL:
   case STATE_PAUSED_UP:
-    return QColor(255, 0, 0); // red
+    return paused;
   case STATE_QUEUED_DL:
-  case STATE_QUEUED_UP:
   case STATE_CHECKING_UP:
   case STATE_CHECKING_DL:
   case STATE_QUEUED_CHECK:
   case STATE_QUEUED_FASTCHECK:
-    return QColor(128, 128, 128); // grey
+    return queuedDown;
+  case STATE_QUEUED_UP:
+    return queuedUp;
   case STATE_INVALID:
     return QColor(255, 0, 0); // red
   default:
