void ApiTrace::callError(ApiTraceCall *call)
 {
+    Q_ASSERT(call);
+
+    if (call->hasError())
+        m_errors.insert(call);
+    else
+        m_errors.remove(call);
+
     emit changed(call);
 }
 
+bool ApiTrace::hasErrors() const
+{
+    return !m_errors.isEmpty();
+}
+
 #include "apitrace.moc"
 
 
     bool isSaving() const;
 
+    bool hasErrors() const;
+
 public slots:
     void setFileName(const QString &name);
     void setFrameMarker(FrameMarker marker);
     QSet<ApiTraceCall*> m_editedCalls;
 
     bool m_needsSaving;
+
+    QSet<ApiTraceCall*> m_errors;
 };
 
 #endif
 
     "    color: #0000ff;\n"
     "}\n"
     ".error {\n"
+    "    border: 1px solid rgb(255,0,0);\n"
     "    margin: 10px;\n"
-    "    padding: 0;\n"
-    "    color: red;\n"
-    "    background: #6fb2e5;\n"
-    "    box-shadow: 0 1px 5px #0061aa, inset 0 10px 20px #b6f9ff;\n"
-    "    -o-box-shadow: 0 1px 5px #0061aa, inset 0 10px 20px #b6f9ff;\n"
-    "    -webkit-box-shadow: 0 1px 5px #0061aa, inset 0 10px 20px #b6f9ff;\n"
-    "    -moz-box-shadow: 0 1px 5px #0061aa, inset 0 10px 20px #b6f9ff;\n"
+    "    padding: 1;\n"
+    "    border-radius: 4px;\n"
+    // also looks great but qtwebkit doesn't support it
+    //"    background: #6fb2e5;\n"
+    //"    box-shadow: 0 1px 5px #0061aa, inset 0 10px 20px #b6f9ff;\n"
+    //"    -o-box-shadow: 0 1px 5px #0061aa, inset 0 10px 20px #b6f9ff;\n"
+    //"    -webkit-box-shadow: 0 1px 5px #0061aa, inset 0 10px 20px #b6f9ff;\n"
+    //"    -moz-box-shadow: 0 1px 5px #0061aa, inset 0 10px 20px #b6f9ff;\n"
     "}\n";
 
 ApiPointer::ApiPointer(unsigned long long val)
     }
     m_richText += QLatin1String("</div>");
 
+    if (hasError()) {
+        QString errorStr =
+            QString::fromLatin1(
+                "<div class=\"error\">%1</div>")
+            .arg(m_error);
+        m_richText += errorStr;
+    }
+
     m_richText =
         QString::fromLatin1(
             "<html><head><style type=\"text/css\" media=\"all\">"
     if (m_error != msg) {
         ApiTrace *trace = parentTrace();
         m_error = msg;
+        m_richText = QString();
         if (trace)
             trace->callError(this);
     }
 
 {
     ApiTrace *trace = call->parentFrame()->parentTrace();
 
-#if 1
+#if 0
     qDebug()<<"Call changed = "<<call->edited();
     qDebug()<<"\ttrace edited = "<<trace->edited();
     qDebug()<<"\ttrace file = "<<trace->fileName();
 
             this, SLOT(slotStartedSaving()));
     connect(m_trace, SIGNAL(saved()),
             this, SLOT(slotSaved()));
+    connect(m_trace, SIGNAL(changed(ApiTraceCall*)),
+            this, SLOT(slotTraceChanged(ApiTraceCall*)));
 
     connect(m_retracer, SIGNAL(finished(const QString&)),
             this, SLOT(replayFinished(const QString&)));
 void MainWindow::replayStateFound(const ApiTraceState &state)
 {
     m_stateEvent->setState(state);
-    if (m_stateEvent->type() == ApiTraceEvent::Call) {
-        ApiTraceCall *call = static_cast<ApiTraceCall*>(m_stateEvent);
-        call->setError(tr("Some wonky error."));
-    }
     m_model->stateSetOnEvent(m_stateEvent);
     if (m_selectedEvent == m_stateEvent) {
         fillStateForFrame();
     return NULL;
 }
 
+void MainWindow::slotTraceChanged(ApiTraceCall *call)
+{
+    Q_ASSERT(call);
+    if (call == m_selectedEvent) {
+        m_ui.detailsWebView->setHtml(call->toHtml());
+    }
+}
+
 #include "mainwindow.moc"
 
 #include <QProcess>
 
 class ApiTrace;
+class ApiTraceCall;
 class ApiTraceEvent;
 class ApiTraceFilter;
 class ApiTraceFrame;
     void slotSaved();
     void slotGoFrameStart();
     void slotGoFrameEnd();
+    void slotTraceChanged(ApiTraceCall *call);
 
 private:
     void initObjects();