Feature 487 ii
diff --git a/libmproxy/console/flowdetailview.py b/libmproxy/console/flowdetailview.py
index 51ae8da693..1299443d1e 100644
--- a/libmproxy/console/flowdetailview.py
+++ b/libmproxy/console/flowdetailview.py
@@ -35,17 +35,20 @@ def flowtext(self):
         title = urwid.AttrWrap(title, "heading")
         text.append(title)
 
-        if self.flow.server_conn:
+        cc = self.flow.client_conn
+        sc = self.flow.server_conn
+        req = self.flow.request;
+        resp = self.flow.response;        
+
+        if sc:
             text.append(urwid.Text([("head", "Server Connection:")]))
-            sc = self.flow.server_conn
             parts = [
                 ["Address", "%s:%s" % sc.address()],
-                ["Start time", utils.format_timestamp(sc.timestamp_start)],
-                ["End time", utils.format_timestamp(sc.timestamp_end) if sc.timestamp_end else "active"],
             ]
+            
             text.extend(common.format_keyvals(parts, key="key", val="text", indent=4))
 
-            c = self.flow.server_conn.cert
+            c = sc.cert
             if c:
                 text.append(urwid.Text([("head", "Server Certificate:")]))
                 parts = [
@@ -79,15 +82,32 @@ def flowtext(self):
                     )
                 text.extend(common.format_keyvals(parts, key="key", val="text", indent=4))
 
-        if self.flow.client_conn:
+        if cc:
             text.append(urwid.Text([("head", "Client Connection:")]))
-            cc = self.flow.client_conn
+
             parts = [
                 ["Address", "%s:%s" % cc.address()],
-                ["Start time", utils.format_timestamp(cc.timestamp_start)],
                 # ["Requests", "%s"%cc.requestcount],
-                ["End time", utils.format_timestamp(cc.timestamp_end) if cc.timestamp_end else "active"],
             ]
+   
             text.extend(common.format_keyvals(parts, key="key", val="text", indent=4))
 
+        parts = []
+
+        parts.append(["Client conn. established", utils.format_timestamp_with_milli(cc.timestamp_start) if (cc and cc.timestamp_start) else "active"])
+        parts.append(["Server conn. initiated", utils.format_timestamp_with_milli(sc.timestamp_start) if sc else "active" ])
+        parts.append(["Server conn. TCP handshake", utils.format_timestamp_with_milli(sc.timestamp_tcp_setup) if (sc and sc.timestamp_tcp_setup) else "active"])
+        if sc.ssl_established:
+            parts.append(["Server conn. SSL handshake", utils.format_timestamp_with_milli(sc.timestamp_ssl_setup) if sc.timestamp_ssl_setup else "active"])
+            parts.append(["Client conn. SSL handshake", utils.format_timestamp_with_milli(cc.timestamp_ssl_setup) if (cc and cc.timestamp_ssl_setup) else "active"])
+        parts.append(["First request byte", utils.format_timestamp_with_milli(req.timestamp_start)])
+        parts.append(["Request complete", utils.format_timestamp_with_milli(req.timestamp_end) if req.timestamp_end else "active"])
+        parts.append(["First response byte", utils.format_timestamp_with_milli(resp.timestamp_start) if resp else "active"])
+        parts.append(["Response complete", utils.format_timestamp_with_milli(resp.timestamp_end) if (resp and resp.timestamp_end) else "active"])
+
+        # sort operations by timestamp 
+        parts = sorted(parts, key=lambda p: p[1])
+
+        text.append(urwid.Text([("head", "Timing:")]))
+        text.extend(common.format_keyvals(parts, key="key", val="text", indent=4))
         return text
diff --git a/libmproxy/utils.py b/libmproxy/utils.py
index 76e99c34ff..e2306c110d 100644
--- a/libmproxy/utils.py
+++ b/libmproxy/utils.py
@@ -15,7 +15,10 @@ def format_timestamp(s):
     d = datetime.datetime.fromtimestamp(time.mktime(s))
     return d.strftime("%Y-%m-%d %H:%M:%S")
 
-
+def format_timestamp_with_milli(s):
+    d = datetime.datetime.fromtimestamp(s)
+    return d.strftime("%Y-%m-%d %H:%M:%S.")+str(d.microsecond/1000).zfill(3)
+    
 def isBin(s):
     """
         Does this string have any non-ASCII characters?
diff --git a/test/test_utils.py b/test/test_utils.py
index 45bfb4f7f7..78d1c0725e 100644
--- a/test/test_utils.py
+++ b/test/test_utils.py
@@ -8,6 +8,8 @@
 def test_format_timestamp():
     assert utils.format_timestamp(utils.timestamp())
 
+def test_format_timestamp_with_milli():
+    assert utils.format_timestamp_with_milli(utils.timestamp())
 
 def test_isBin():
     assert not utils.isBin("testing\n\r")

Hi Max,
I've added detailed timing information to FlowDetailView, as you requested in #487 
They are in the same order that where in the screenshot and then are sorted by timestamp like is done in https://github.com/mitmproxy/mitmproxy/blob/master/libmproxy/web/static/app.js#L1084 
there is no delta for now, but can [easily] be added later.
Regards.
Marcelo
