diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/QuasseldroidNG.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/QuasseldroidNG.kt
index 78add5c87ccf62370f27c6104a13ee1eb842b12a..8eac657318ec22d887adf509047a796b15841245 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/QuasseldroidNG.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/QuasseldroidNG.kt
@@ -18,7 +18,10 @@ class QuasseldroidNG : Application() {
   }
 
   override fun onCreate() {
-    CrashHandler.init(this, buildConfig = BuildConfig::class.java)
+    CrashHandler.init(
+      application = this,
+      buildConfig = BuildConfig::class.java
+    )
     super.onCreate()
 
     // Init compatibility utils
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatActivity.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatActivity.kt
index e3418711929e1705790edd411f9a9af2cc46b0b9..be2ccd8d052e9161a68de4d8d2c639e2c8de8c30 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatActivity.kt
@@ -20,6 +20,7 @@ import de.kuschku.libquassel.session.SessionManager
 import de.kuschku.libquassel.session.SocketAddress
 import de.kuschku.libquassel.util.compatibility.LoggingHandler
 import de.kuschku.libquassel.util.compatibility.LoggingHandler.LogLevel.INFO
+import de.kuschku.malheur.CrashHandler
 import de.kuschku.quasseldroid_ng.Keys
 import de.kuschku.quasseldroid_ng.R
 import de.kuschku.quasseldroid_ng.persistence.AccountDatabase
@@ -111,6 +112,17 @@ class ChatActivity : ServiceBoundActivity() {
               true
             )
           }
+          CrashHandler.handle(
+            IllegalArgumentException(
+              "WRONG!",
+              RuntimeException(
+                "WRONG!",
+                NullPointerException(
+                  "Super wrong!"
+                )
+              )
+            )
+          )
         }
       }
     })
diff --git a/malheur/src/main/java/de/kuschku/malheur/CrashContext.kt b/malheur/src/main/java/de/kuschku/malheur/CrashContext.kt
index ec7719c1f9437b7ddc31d766f50aaa9156c84684..607f1e01c543b7680a3d90937465efbc185c5057 100644
--- a/malheur/src/main/java/de/kuschku/malheur/CrashContext.kt
+++ b/malheur/src/main/java/de/kuschku/malheur/CrashContext.kt
@@ -11,5 +11,6 @@ data class CrashContext(
   val throwable: Throwable,
   val startTime: Date,
   val crashTime: Date,
-  val buildConfig: Class<*>?
+  val buildConfig: Class<*>?,
+  val stackTraces: Map<Thread, Array<StackTraceElement>>?
 )
diff --git a/malheur/src/main/java/de/kuschku/malheur/CrashHandler.kt b/malheur/src/main/java/de/kuschku/malheur/CrashHandler.kt
index 4fe85518c1508d6ae14c57e5e3eede0e6cc494c1..7d98d97cd0ad02fbd336f1d999840de27a0892e0 100644
--- a/malheur/src/main/java/de/kuschku/malheur/CrashHandler.kt
+++ b/malheur/src/main/java/de/kuschku/malheur/CrashHandler.kt
@@ -20,6 +20,8 @@ object CrashHandler {
 
     val reportCollector = ReportCollector(application)
     myHandler = Thread.UncaughtExceptionHandler { activeThread, throwable ->
+      val crashTime = Date()
+      val stackTraces = Thread.getAllStackTraces()
       Thread {
         try {
           val json = gson.toJson(reportCollector.collect(CrashContext(
@@ -28,11 +30,13 @@ object CrashHandler {
             crashingThread = activeThread,
             throwable = throwable,
             startTime = startTime,
-            crashTime = Date(),
-            buildConfig = buildConfig
+            crashTime = crashTime,
+            buildConfig = buildConfig,
+            stackTraces = stackTraces
           ), config))
           println(json)
         } catch (e: Throwable) {
+          e.printStackTrace()
           originalHandler?.uncaughtException(activeThread, throwable)
         }
       }.start()
@@ -40,5 +44,9 @@ object CrashHandler {
     Thread.setDefaultUncaughtExceptionHandler(myHandler)
   }
 
+  fun handle(throwable: Throwable) {
+    myHandler?.uncaughtException(Thread.currentThread(), throwable)
+  }
+
   var myHandler: Thread.UncaughtExceptionHandler? = null
 }
diff --git a/malheur/src/main/java/de/kuschku/malheur/collectors/ConfigurationCollector.kt b/malheur/src/main/java/de/kuschku/malheur/collectors/ConfigurationCollector.kt
index bb0bcfe4b2071a1982eb83c27006346807a838ef..2d880d830c977642a093a84420d61c82d564d6a6 100644
--- a/malheur/src/main/java/de/kuschku/malheur/collectors/ConfigurationCollector.kt
+++ b/malheur/src/main/java/de/kuschku/malheur/collectors/ConfigurationCollector.kt
@@ -11,12 +11,6 @@ class ConfigurationCollector(private val application: Application) :
   private val configValueInfo = mutableMapOf<String, SparseArray<String>>()
 
   private val configurationFields = listOf(
-    FieldDefinition(
-      fieldName = "mcc"
-    ),
-    FieldDefinition(
-      fieldName = "mnc"
-    ),
     FieldDefinition(
       fieldName = "screenHeightDp"
     ),
diff --git a/malheur/src/main/java/de/kuschku/malheur/collectors/CrashCollector.kt b/malheur/src/main/java/de/kuschku/malheur/collectors/CrashCollector.kt
index 99fc29c1c0afb142852c128d7587e17207b6103c..7174dc0194c7c9ce6a75e4e95c75336dd0db9241 100644
--- a/malheur/src/main/java/de/kuschku/malheur/collectors/CrashCollector.kt
+++ b/malheur/src/main/java/de/kuschku/malheur/collectors/CrashCollector.kt
@@ -1,35 +1,22 @@
 package de.kuschku.malheur.collectors
 
-import android.app.Application
 import de.kuschku.malheur.CrashContext
 import de.kuschku.malheur.config.CrashConfig
 import de.kuschku.malheur.data.CrashInfo
 import de.kuschku.malheur.data.ExceptionInfo
-import de.kuschku.malheur.data.ThreadInfo
-import de.kuschku.malheur.util.printStackTraceToString
-import java.text.SimpleDateFormat
-import java.util.*
-
-class CrashCollector(application: Application) : Collector<CrashInfo, CrashConfig> {
-  private val configurationCollector = ConfigurationCollector(application)
-  private val isoFormatter = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX", Locale.US)
+import java.io.PrintWriter
+import java.io.StringWriter
 
+class CrashCollector : Collector<CrashInfo, CrashConfig> {
   override fun collect(context: CrashContext, config: CrashConfig) = CrashInfo(
     cause = collectIf(config.cause) {
       ExceptionInfo(context.throwable)
     },
     exception = collectIf(config.exception) {
-      context.throwable.printStackTraceToString()
-    },
-    activeThread = collectIf(config.activeThread) {
-      ThreadInfo(context.crashingThread)
-    },
-    startTime = collectIf(config.startTime) {
-      isoFormatter.format(context.startTime)
-    },
-    crashTime = collectIf(config.crashTime) {
-      isoFormatter.format(context.crashTime)
-    },
-    configuration = configurationCollector.collectIf(context, config.configuration)
+      val result = StringWriter()
+      val printWriter = PrintWriter(result)
+      context.throwable.printStackTrace(printWriter)
+      result.toString()
+    }
   )
 }
diff --git a/malheur/src/main/java/de/kuschku/malheur/collectors/DeviceCollector.kt b/malheur/src/main/java/de/kuschku/malheur/collectors/DeviceCollector.kt
index 2768e1a065d9c7090574eb61a57162cc73d59551..fa2d2fd584b2133d259829425e316d8fc003a3ac 100644
--- a/malheur/src/main/java/de/kuschku/malheur/collectors/DeviceCollector.kt
+++ b/malheur/src/main/java/de/kuschku/malheur/collectors/DeviceCollector.kt
@@ -7,23 +7,38 @@ import android.provider.Settings
 import de.kuschku.malheur.CrashContext
 import de.kuschku.malheur.config.DeviceConfig
 import de.kuschku.malheur.data.DeviceInfo
-import de.kuschku.malheur.util.readProcInfo
 import de.kuschku.malheur.util.reflectionCollectConstants
+import java.io.File
 
 class DeviceCollector(private val application: Application) : Collector<DeviceInfo, DeviceConfig> {
+  private val displayCollector = DisplayCollector(application)
+
   @SuppressLint("HardwareIds")
-  override fun collect(context: CrashContext, config: DeviceConfig) = DeviceInfo(
-    build = collectIf(config.build) {
-      reflectionCollectConstants(Build::class.java)
-    },
-    version = collectIf(config.version) {
-      reflectionCollectConstants(Build.VERSION::class.java)
-    },
-    installationId = collectIf(config.installationId) {
-      Settings.Secure.getString(application.contentResolver, Settings.Secure.ANDROID_ID)
-    },
-    processor = collectIf(config.processor) {
-      readProcInfo()
-    }
-  )
+  override fun collect(context: CrashContext, config: DeviceConfig): DeviceInfo {
+    return DeviceInfo(
+      build = collectIf(config.build) {
+        reflectionCollectConstants(Build::class.java)
+      },
+      version = collectIf(config.version) {
+        reflectionCollectConstants(Build.VERSION::class.java)
+      },
+      installationId = collectIf(config.installationId) {
+        Settings.Secure.getString(application.contentResolver, Settings.Secure.ANDROID_ID)
+      },
+      processor = collectIf(config.processor) {
+        readProcInfo()
+      },
+      display = displayCollector.collectIf(context, config.display)
+    )
+  }
+
+  private fun readProcInfo() = File("/proc/cpuinfo")
+    .bufferedReader(Charsets.UTF_8)
+    .lineSequence()
+    .map { line -> line.split(":") }
+    .filter { split -> split.size == 2 }
+    .map { (key, value) -> key.trim() to value.trim() }
+    .filter { (key, _) -> key == "Hardware" }
+    .map { (_, value) -> value }
+    .firstOrNull()
 }
diff --git a/malheur/src/main/java/de/kuschku/malheur/collectors/DisplayCollector.kt b/malheur/src/main/java/de/kuschku/malheur/collectors/DisplayCollector.kt
new file mode 100644
index 0000000000000000000000000000000000000000..c00c076102a930ba8be2e5798461cdb96cc23945
--- /dev/null
+++ b/malheur/src/main/java/de/kuschku/malheur/collectors/DisplayCollector.kt
@@ -0,0 +1,61 @@
+package de.kuschku.malheur.collectors
+
+import android.app.Application
+import android.content.Context
+import android.os.Build
+import android.util.SparseArray
+import android.view.Display
+import android.view.WindowManager
+import de.kuschku.malheur.CrashContext
+import de.kuschku.malheur.data.DisplayInfo
+import de.kuschku.malheur.data.MetricsInfo
+import de.kuschku.malheur.util.getMetrics
+import java.lang.reflect.Modifier
+
+class DisplayCollector(application: Application) :
+  Collector<DisplayInfo, Boolean> {
+  private val windowManager = application.getSystemService(
+    Context.WINDOW_SERVICE) as WindowManager
+
+  @Suppress("DEPRECATION")
+  override fun collect(context: CrashContext, config: Boolean): DisplayInfo? {
+    val display = windowManager.defaultDisplay
+    val hdrCapabilities = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+      val capabilitiesEnum = getHdrCapabilitiesEnum()
+      display.hdrCapabilities.supportedHdrTypes.map(capabilitiesEnum::get)
+    } else {
+      null
+    }
+    return DisplayInfo(
+      width = display.width,
+      height = display.height,
+      pixelFormat = display.pixelFormat,
+      refreshRate = display.refreshRate,
+      hdr = hdrCapabilities,
+      isWideGamut = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+        display.isWideColorGamut
+      } else {
+        null
+      },
+      metrics = MetricsInfo(display.getMetrics())
+    )
+  }
+
+  private fun getHdrCapabilitiesEnum(): SparseArray<String> {
+    val hdrCapabilityEnums = SparseArray<String>()
+    Display.HdrCapabilities::class.java.declaredFields.filter {
+      Modifier.isStatic(it.modifiers)
+    }.filter {
+      it.name.startsWith("HDR_TYPE_")
+    }.filter {
+      it.type == Int::class.java
+    }.forEach {
+      try {
+        val value = it.getInt(null)
+        hdrCapabilityEnums.put(value, it.name.substring("HDR_TYPE_".length))
+      } catch (e: IllegalAccessException) {
+      }
+    }
+    return hdrCapabilityEnums
+  }
+}
diff --git a/malheur/src/main/java/de/kuschku/malheur/collectors/EnvCollector.kt b/malheur/src/main/java/de/kuschku/malheur/collectors/EnvCollector.kt
index fb5ca1e8aa16bc1ab111fee0cc3b1244aa5175f9..5cb6e7d952f1cbcf4ec3526a48664f74893632ea 100644
--- a/malheur/src/main/java/de/kuschku/malheur/collectors/EnvCollector.kt
+++ b/malheur/src/main/java/de/kuschku/malheur/collectors/EnvCollector.kt
@@ -5,13 +5,16 @@ import android.os.Debug
 import android.os.Environment
 import de.kuschku.malheur.CrashContext
 import de.kuschku.malheur.config.EnvConfig
+import de.kuschku.malheur.data.EnvInfo
 import de.kuschku.malheur.data.MemoryInfo
 import de.kuschku.malheur.util.reflectionCollectGetters
 import java.io.File
 
-class EnvCollector(application: Application) : Collector<Map<String, Any?>, EnvConfig> {
-  override fun collect(context: CrashContext, config: EnvConfig) = mapOf(
-    "paths" to collectIf(config.paths) {
+class EnvCollector(application: Application) : Collector<EnvInfo, EnvConfig> {
+  private val configurationCollector = ConfigurationCollector(application)
+
+  override fun collect(context: CrashContext, config: EnvConfig) = EnvInfo(
+    paths = collectIf(config.paths) {
       reflectionCollectGetters(
         Environment::class.java)?.map { (key, value) ->
         key to if (value is File) {
@@ -21,10 +24,17 @@ class EnvCollector(application: Application) : Collector<Map<String, Any?>, EnvC
         }
       }?.toMap()
     },
-    "memory" to collectIf(config.memory) {
+    memory = collectIf(config.memory) {
       val memoryInfo = Debug.MemoryInfo()
       Debug.getMemoryInfo(memoryInfo)
       MemoryInfo(memoryInfo)
+    },
+    configuration = configurationCollector.collectIf(context, config.configuration),
+    startTime = collectIf(config.startTime) {
+      context.startTime.time
+    },
+    crashTime = collectIf(config.crashTime) {
+      context.crashTime.time
     }
   )
 }
diff --git a/malheur/src/main/java/de/kuschku/malheur/collectors/LogCollector.kt b/malheur/src/main/java/de/kuschku/malheur/collectors/LogCollector.kt
index a8d1733135115bef8165acb9b402570401546b5d..8ea759ca2c4d577cd51f51d6648a37baf0b91a61 100644
--- a/malheur/src/main/java/de/kuschku/malheur/collectors/LogCollector.kt
+++ b/malheur/src/main/java/de/kuschku/malheur/collectors/LogCollector.kt
@@ -1,21 +1,25 @@
 package de.kuschku.malheur.collectors
 
-import android.app.Application
-import android.os.Process
 import de.kuschku.malheur.CrashContext
 import de.kuschku.malheur.config.LogConfig
-import de.kuschku.malheur.util.readLogCat
 import java.text.SimpleDateFormat
 import java.util.*
 
-class LogCollector(application: Application) : Collector<Map<String, List<String>>, LogConfig> {
+class LogCollector : Collector<Map<String, List<String>>, LogConfig> {
   private val logcatTimeFormatter = SimpleDateFormat("MM-dd HH:mm:ss.SSS", Locale.US)
-  private val pid = Process.myPid().toString()
 
   override fun collect(context: CrashContext, config: LogConfig): Map<String, List<String>> {
     val since = logcatTimeFormatter.format(context.startTime)
     return config.buffers.map { buffer ->
-      buffer to readLogCat(since, buffer, pid)
+      buffer to readLogCat(since, buffer)
     }.toMap()
   }
+
+  private fun readLogCat(since: String, buffer: String) = ProcessBuilder()
+    .command("logcat", "-t", since, "-b", buffer)
+    .redirectErrorStream(true)
+    .start()
+    .inputStream
+    .bufferedReader(Charsets.UTF_8)
+    .readLines()
 }
diff --git a/malheur/src/main/java/de/kuschku/malheur/collectors/ReportCollector.kt b/malheur/src/main/java/de/kuschku/malheur/collectors/ReportCollector.kt
index ebe95f841240d2fbc125c7a97ba3e8a7a570ccfe..7c0eb23e6e9908d3b2347504454b316b85883028 100644
--- a/malheur/src/main/java/de/kuschku/malheur/collectors/ReportCollector.kt
+++ b/malheur/src/main/java/de/kuschku/malheur/collectors/ReportCollector.kt
@@ -4,24 +4,18 @@ import android.app.Application
 import de.kuschku.malheur.CrashContext
 import de.kuschku.malheur.config.ReportConfig
 import de.kuschku.malheur.data.Report
-import de.kuschku.malheur.data.ThreadInfo
 
 class ReportCollector(application: Application) : Collector<Report, ReportConfig> {
-  private val logcatCollector = LogCollector(application)
-  private val crashCollector = CrashCollector(application)
+  private val crashCollector = CrashCollector()
+  private val threadCollector = ThreadCollector()
+  private val logcatCollector = LogCollector()
   private val applicationCollector = AppCollector(application)
   private val deviceCollector = DeviceCollector(application)
   private val environmentCollector = EnvCollector(application)
 
   override fun collect(context: CrashContext, config: ReportConfig) = Report(
     crash = crashCollector.collectIf(context, config.crash),
-    threads = collectIf(config.threads) {
-      Thread.getAllStackTraces()
-        .filterKeys { it != Thread.currentThread() }
-        .map { (thread, stackTrace) ->
-          ThreadInfo(thread, stackTrace)
-        }
-    },
+    threads = threadCollector.collectIf(context, config.threads),
     logcat = logcatCollector.collectIf(context, config.logcat),
     application = applicationCollector.collectIf(context, config.application),
     device = deviceCollector.collectIf(context, config.device),
diff --git a/malheur/src/main/java/de/kuschku/malheur/collectors/ThreadCollector.kt b/malheur/src/main/java/de/kuschku/malheur/collectors/ThreadCollector.kt
new file mode 100644
index 0000000000000000000000000000000000000000..e8d374e93a00d18a201f0c9510201c970fea60d4
--- /dev/null
+++ b/malheur/src/main/java/de/kuschku/malheur/collectors/ThreadCollector.kt
@@ -0,0 +1,59 @@
+package de.kuschku.malheur.collectors
+
+import de.kuschku.malheur.CrashContext
+import de.kuschku.malheur.CrashHandler
+import de.kuschku.malheur.config.ThreadConfig
+import de.kuschku.malheur.data.ThreadInfo
+import de.kuschku.malheur.data.ThreadsInfo
+import de.kuschku.malheur.data.TraceElement
+
+class ThreadCollector : Collector<ThreadsInfo, ThreadConfig> {
+  override fun collect(context: CrashContext, config: ThreadConfig) = ThreadsInfo(
+    crashed = context.stackTraces?.filterKeys {
+      it == context.crashingThread
+    }?.map { (thread, stackTrace) ->
+      threadToInfo(thread, stackTrace)
+    }?.firstOrNull(),
+    others = context.stackTraces?.filterKeys {
+      it != Thread.currentThread() && it != context.crashingThread
+    }?.map { (thread, stackTrace) ->
+      threadToInfo(thread, stackTrace)
+    }
+  )
+
+  private fun threadToInfo(thread: Thread, stackTrace: Array<StackTraceElement>) = ThreadInfo(
+    id = thread.id,
+    name = thread.name,
+    group = thread.threadGroup?.name,
+    status = thread.state?.name,
+    stackTrace = ArrayList(sanitize(stackTrace.map(::TraceElement))),
+    isDaemon = thread.isDaemon,
+    priority = thread.priority
+  )
+
+  private fun sanitize(list: List<TraceElement>): List<TraceElement> {
+    var idx = 0
+    while (idx < list.size) {
+      val traceElement = list[idx]
+      if (traceElement.className == CrashHandler::class.java.canonicalName)
+        break
+      idx++
+    }
+    while (idx < list.size) {
+      val traceElement = list[idx]
+      if (traceElement.className != CrashHandler::class.java.canonicalName)
+        break
+      idx++
+    }
+    val after = mutableListOf<TraceElement>()
+    while (idx < list.size) {
+      val traceElement = list[idx]
+      after.add(traceElement)
+      idx++
+    }
+
+    return if (after.size > 0) {
+      after
+    } else list
+  }
+}
diff --git a/malheur/src/main/java/de/kuschku/malheur/config/CrashConfig.kt b/malheur/src/main/java/de/kuschku/malheur/config/CrashConfig.kt
index 05728d5becab5f951c12cd2403b54fb660714cb9..e0fff52261251a769117d4b91021fd2e5df345af 100644
--- a/malheur/src/main/java/de/kuschku/malheur/config/CrashConfig.kt
+++ b/malheur/src/main/java/de/kuschku/malheur/config/CrashConfig.kt
@@ -2,9 +2,5 @@ package de.kuschku.malheur.config
 
 data class CrashConfig(
   val cause: Boolean = true,
-  val exception: Boolean = true,
-  val activeThread: Boolean = true,
-  val startTime: Boolean = true,
-  val crashTime: Boolean = true,
-  val configuration: Boolean = true
+  val exception: Boolean = true
 )
diff --git a/malheur/src/main/java/de/kuschku/malheur/config/DeviceConfig.kt b/malheur/src/main/java/de/kuschku/malheur/config/DeviceConfig.kt
index ca332a7733ac53d9c7c6a88869eb065dbfde1dc2..337e4f3a9d415546aba6ee6d128900d85ef19501 100644
--- a/malheur/src/main/java/de/kuschku/malheur/config/DeviceConfig.kt
+++ b/malheur/src/main/java/de/kuschku/malheur/config/DeviceConfig.kt
@@ -5,5 +5,6 @@ data class DeviceConfig(
   val version: Boolean = true,
   val installationId: Boolean = true,
   val processor: Boolean = true,
-  val runtime: Boolean = true
+  val runtime: Boolean = true,
+  val display: Boolean = true
 )
diff --git a/malheur/src/main/java/de/kuschku/malheur/config/EnvConfig.kt b/malheur/src/main/java/de/kuschku/malheur/config/EnvConfig.kt
index 29c5fbbfae95173d62ad34d864d780a43b0559e3..aedd636e4e83f3e77a98e2cff49d271285c8f126 100644
--- a/malheur/src/main/java/de/kuschku/malheur/config/EnvConfig.kt
+++ b/malheur/src/main/java/de/kuschku/malheur/config/EnvConfig.kt
@@ -2,5 +2,8 @@ package de.kuschku.malheur.config
 
 data class EnvConfig(
   val paths: Boolean = true,
-  val memory: Boolean = true
+  val memory: Boolean = true,
+  val configuration: Boolean = true,
+  val startTime: Boolean = true,
+  val crashTime: Boolean = true
 )
diff --git a/malheur/src/main/java/de/kuschku/malheur/config/ReportConfig.kt b/malheur/src/main/java/de/kuschku/malheur/config/ReportConfig.kt
index 4ee6eedec3556a4b4a975aa0f47b7a56f9776093..9c3ae20ef9a9aacf57c2a055fae406d7126944b8 100644
--- a/malheur/src/main/java/de/kuschku/malheur/config/ReportConfig.kt
+++ b/malheur/src/main/java/de/kuschku/malheur/config/ReportConfig.kt
@@ -2,7 +2,7 @@ package de.kuschku.malheur.config
 
 data class ReportConfig(
   val crash: CrashConfig? = CrashConfig(),
-  val threads: Boolean = true,
+  val threads: ThreadConfig? = ThreadConfig(),
   val logcat: LogConfig? = LogConfig(),
   val application: AppConfig? = AppConfig(),
   val device: DeviceConfig? = DeviceConfig(),
diff --git a/malheur/src/main/java/de/kuschku/malheur/config/ThreadConfig.kt b/malheur/src/main/java/de/kuschku/malheur/config/ThreadConfig.kt
new file mode 100644
index 0000000000000000000000000000000000000000..3a680c183fffd9701d46f1f4cadb3a51ca57ce3f
--- /dev/null
+++ b/malheur/src/main/java/de/kuschku/malheur/config/ThreadConfig.kt
@@ -0,0 +1,6 @@
+package de.kuschku.malheur.config
+
+data class ThreadConfig(
+  val current: Boolean = true,
+  val others: Boolean = true
+)
diff --git a/malheur/src/main/java/de/kuschku/malheur/data/CrashInfo.kt b/malheur/src/main/java/de/kuschku/malheur/data/CrashInfo.kt
index 609624d65cc393b259a061c40fe73e36e2056f06..6be355b19c585d8af2830f879ac0cd1b23087904 100644
--- a/malheur/src/main/java/de/kuschku/malheur/data/CrashInfo.kt
+++ b/malheur/src/main/java/de/kuschku/malheur/data/CrashInfo.kt
@@ -2,9 +2,5 @@ package de.kuschku.malheur.data
 
 data class CrashInfo(
   val cause: ExceptionInfo?,
-  val exception: String?,
-  val activeThread: ThreadInfo?,
-  val startTime: String?,
-  val crashTime: String?,
-  val configuration: Map<String, Any?>?
+  val exception: String?
 )
diff --git a/malheur/src/main/java/de/kuschku/malheur/data/DeviceInfo.kt b/malheur/src/main/java/de/kuschku/malheur/data/DeviceInfo.kt
index bd9a07ac51640f2ec1be6413144d0e452782d877..661c9fbd0c39b3a686a5f53fec359b53b6de3399 100644
--- a/malheur/src/main/java/de/kuschku/malheur/data/DeviceInfo.kt
+++ b/malheur/src/main/java/de/kuschku/malheur/data/DeviceInfo.kt
@@ -4,5 +4,6 @@ data class DeviceInfo(
   val build: Map<String, Any?>?,
   val version: Map<String, Any?>?,
   val installationId: String?,
-  val processor: String?
+  val processor: String?,
+  val display: DisplayInfo?
 )
diff --git a/malheur/src/main/java/de/kuschku/malheur/data/DisplayInfo.kt b/malheur/src/main/java/de/kuschku/malheur/data/DisplayInfo.kt
index 38e1b7a2dd6bf89b36cd85cf834725f5ed8a3b97..a90e716f39b04d5fa5c45be7e63c902eb2801829 100644
--- a/malheur/src/main/java/de/kuschku/malheur/data/DisplayInfo.kt
+++ b/malheur/src/main/java/de/kuschku/malheur/data/DisplayInfo.kt
@@ -1,24 +1,11 @@
 package de.kuschku.malheur.data
 
-import android.view.Display
-import de.kuschku.malheur.util.getMetrics
-
 data class DisplayInfo(
   val width: Int,
   val height: Int,
   val pixelFormat: Int,
   val refreshRate: Float,
-  val isHdr: Boolean,
-  val isWideGamut: Boolean,
+  val hdr: List<String>?,
+  val isWideGamut: Boolean?,
   val metrics: MetricsInfo
-) {
-  constructor(display: Display) : this(
-    width = display.width,
-    height = display.height,
-    pixelFormat = display.pixelFormat,
-    refreshRate = display.refreshRate,
-    isHdr = display.isHdr,
-    isWideGamut = display.isWideColorGamut,
-    metrics = MetricsInfo(display.getMetrics())
-  )
-}
+)
diff --git a/malheur/src/main/java/de/kuschku/malheur/data/EnvInfo.kt b/malheur/src/main/java/de/kuschku/malheur/data/EnvInfo.kt
new file mode 100644
index 0000000000000000000000000000000000000000..c18f4887681ddfa4243a54dcd028005980831611
--- /dev/null
+++ b/malheur/src/main/java/de/kuschku/malheur/data/EnvInfo.kt
@@ -0,0 +1,9 @@
+package de.kuschku.malheur.data
+
+data class EnvInfo(
+  val paths: Map<String, Any?>?,
+  val memory: MemoryInfo?,
+  val configuration: Map<String, Any?>?,
+  val startTime: Long?,
+  val crashTime: Long?
+)
diff --git a/malheur/src/main/java/de/kuschku/malheur/data/Report.kt b/malheur/src/main/java/de/kuschku/malheur/data/Report.kt
index d0dfbb9dd2faa2b234d063f56f961f3f89d2f195..8cb399f449c99a4005cd1bbe472c668bca48a394 100644
--- a/malheur/src/main/java/de/kuschku/malheur/data/Report.kt
+++ b/malheur/src/main/java/de/kuschku/malheur/data/Report.kt
@@ -2,9 +2,9 @@ package de.kuschku.malheur.data
 
 data class Report(
   val crash: CrashInfo?,
-  val threads: List<ThreadInfo>?,
+  val threads: ThreadsInfo?,
   val logcat: Map<String, List<String>?>?,
   val application: AppInfo?,
   val device: DeviceInfo?,
-  val environment: Map<String, Any?>?
+  val environment: EnvInfo?
 )
diff --git a/malheur/src/main/java/de/kuschku/malheur/data/ThreadInfo.kt b/malheur/src/main/java/de/kuschku/malheur/data/ThreadInfo.kt
index e80b4fc7679504e0f2bb369353a001281783b849..6503d9b544425e0303144bfe608a9b10c18e71c7 100644
--- a/malheur/src/main/java/de/kuschku/malheur/data/ThreadInfo.kt
+++ b/malheur/src/main/java/de/kuschku/malheur/data/ThreadInfo.kt
@@ -8,14 +8,4 @@ data class ThreadInfo(
   val stackTrace: List<TraceElement>?,
   val isDaemon: Boolean?,
   val priority: Int?
-) {
-  constructor(thread: Thread, stackTrace: Array<StackTraceElement> = thread.stackTrace) : this(
-    id = thread.id,
-    name = thread.name,
-    group = thread.threadGroup?.name,
-    status = thread.state?.name,
-    stackTrace = ArrayList(stackTrace.map(::TraceElement)),
-    isDaemon = thread.isDaemon,
-    priority = thread.priority
-  )
-}
+)
diff --git a/malheur/src/main/java/de/kuschku/malheur/data/ThreadsInfo.kt b/malheur/src/main/java/de/kuschku/malheur/data/ThreadsInfo.kt
new file mode 100644
index 0000000000000000000000000000000000000000..10d94c6e0a560b90624c683f7a58a395be5af36d
--- /dev/null
+++ b/malheur/src/main/java/de/kuschku/malheur/data/ThreadsInfo.kt
@@ -0,0 +1,6 @@
+package de.kuschku.malheur.data
+
+data class ThreadsInfo(
+  val crashed: ThreadInfo?,
+  val others: List<ThreadInfo>?
+)
diff --git a/malheur/src/main/java/de/kuschku/malheur/util/LogCatHelper.kt b/malheur/src/main/java/de/kuschku/malheur/util/LogCatHelper.kt
deleted file mode 100644
index 8837570c4484812382a6a60bac7f5771562e3d71..0000000000000000000000000000000000000000
--- a/malheur/src/main/java/de/kuschku/malheur/util/LogCatHelper.kt
+++ /dev/null
@@ -1,9 +0,0 @@
-package de.kuschku.malheur.util
-
-fun readLogCat(since: String, buffer: String, pid: String) = ProcessBuilder()
-  .command("logcat", "-t", since, "-b", buffer, "--pid", pid)
-  .redirectErrorStream(true)
-  .start()
-  .inputStream
-  .bufferedReader(Charsets.UTF_8)
-  .readLines()
diff --git a/malheur/src/main/java/de/kuschku/malheur/util/ProcInfohelper.kt b/malheur/src/main/java/de/kuschku/malheur/util/ProcInfohelper.kt
deleted file mode 100644
index 0940b565ae0615f650334684a8496cc60715238c..0000000000000000000000000000000000000000
--- a/malheur/src/main/java/de/kuschku/malheur/util/ProcInfohelper.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package de.kuschku.malheur.util
-
-import java.io.File
-
-fun readProcInfo() = File("/proc/cpuinfo")
-  .bufferedReader(Charsets.UTF_8)
-  .lineSequence()
-  .map { line -> line.split(":") }
-  .filter { split -> split.size == 2 }
-  .map { (key, value) -> key.trim() to value.trim() }
-  .filter { (key, _) -> key == "Hardware" }
-  .map { (_, value) -> value }
-  .firstOrNull()
diff --git a/malheur/src/main/java/de/kuschku/malheur/util/ThrowableHelper.kt b/malheur/src/main/java/de/kuschku/malheur/util/ThrowableHelper.kt
deleted file mode 100644
index c797860ed65155dc670e7c58143950732604de39..0000000000000000000000000000000000000000
--- a/malheur/src/main/java/de/kuschku/malheur/util/ThrowableHelper.kt
+++ /dev/null
@@ -1,11 +0,0 @@
-package de.kuschku.malheur.util
-
-import java.io.PrintWriter
-import java.io.StringWriter
-
-fun Throwable.printStackTraceToString(): String? {
-  val result = StringWriter()
-  val printWriter = PrintWriter(result)
-  printStackTrace(printWriter)
-  return result.toString()
-}