Many updates

- Exit warning dialog is now based on standard NSAlert
- All command-line tools are executed asynchronously using
  NSOperationQueue
- Status is processed using XSLT and visualized in basic HTML format

Also, all constants for command-line tools are moved to wscipt/config.h.  If
new commands needed, they should be added into wscript, which will
eventually create proper config.h file.

Change-Id: I2e7c248f8f3b92085a50c49761bd81702fe8685b
diff --git a/osx/MainMenu.xib b/osx/MainMenu.xib
index 32df3e5..3687eed 100644
--- a/osx/MainMenu.xib
+++ b/osx/MainMenu.xib
@@ -16,10 +16,10 @@
                 <outlet property="connectionStatus" destination="yhj-L6-nZL" id="v5Y-5B-2aW"/>
                 <outlet property="connectionStatusText" destination="EUJ-R2-Os4" id="2pC-dc-tng"/>
                 <outlet property="connectionStatusView" destination="24d-37-bzd" id="AYC-I7-1KX"/>
-                <outlet property="daemonStatus" destination="Tap-5m-ZRP" id="yrK-Nr-zKm"/>
-                <outlet property="daemonStatusText" destination="XxQ-Xi-z1I" id="tTA-y8-Uze"/>
-                <outlet property="daemonStatusView" destination="NBE-Gf-zLc" id="91G-ey-DeA"/>
-                <outlet property="exitWindow" destination="6NI-pK-JJs" id="tLd-My-JXC"/>
+                <outlet property="daemonStatus" destination="Tap-5m-ZRP" id="q20-ix-nDF"/>
+                <outlet property="daemonStatusHtml" destination="3Ah-G1-XHY" id="dSt-SZ-GY8"/>
+                <outlet property="daemonStatusHtmlView" destination="pEE-BK-JGJ" id="bPo-et-95L"/>
+                <outlet property="daemonStatusView" destination="NBE-Gf-zLc" id="vpG-7z-Wdp"/>
                 <outlet property="forwardingSettingsView" destination="lQz-E7-PRx" id="8MT-1G-PZi"/>
                 <outlet property="generalSettingsView" destination="A7D-GN-X5W" id="Apc-XD-aOH"/>
                 <outlet property="ndnPreferences" destination="c5x-Oa-5tb" id="5qP-ZT-G5y"/>
@@ -39,7 +39,6 @@
                 <outlet property="preferencesPanel" destination="coQ-VU-5RU" id="tZs-5C-1La"/>
                 <outlet property="prefixRegistrationSheet" destination="tRY-ba-DfO" id="FJr-yW-O1r"/>
                 <outlet property="securitySettingsView" destination="o3g-Q4-BEo" id="UDh-Kj-DYk"/>
-                <outlet property="testbedSettingsView" destination="Oey-Qd-MNO" id="Quf-pr-l8I"/>
                 <outlet property="tunnelCombobox" destination="xrn-ng-SrO" id="cCr-A0-gR2"/>
             </connections>
         </customObject>
@@ -84,29 +83,30 @@
                 <outlet property="contentViewController" destination="QoL-hX-ilM" id="GKo-LB-19Q"/>
             </connections>
         </popover>
-        <customView id="pEE-BK-JGJ">
-            <rect key="frame" x="0.0" y="0.0" width="330" height="258"/>
+        <customView wantsLayer="YES" placeholderIntrinsicWidth="330" placeholderIntrinsicHeight="258" id="pEE-BK-JGJ">
+            <rect key="frame" x="0.0" y="0.0" width="400" height="200"/>
             <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
             <subviews>
-                <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="90x-3T-Z7e">
-                    <rect key="frame" x="82" y="234" width="166" height="17"/>
+                <textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="3Ah-G1-XHY">
+                    <rect key="frame" x="-3" y="0.0" width="406" height="200"/>
                     <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
-                    <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="NDN Daemon Status" id="Di0-ug-aeg">
-                        <font key="font" metaFont="system"/>
-                        <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
-                        <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
-                    </textFieldCell>
-                </textField>
-                <textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="XxQ-Xi-z1I">
-                    <rect key="frame" x="7" y="7" width="315" height="219"/>
-                    <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
-                    <textFieldCell key="cell" sendsActionOnEndEditing="YES" id="R13-Gb-7b6">
-                        <font key="font" metaFont="system"/>
+                    <constraints>
+                        <constraint firstAttribute="height" relation="greaterThanOrEqual" constant="200" id="iCd-X4-1X1"/>
+                        <constraint firstAttribute="width" relation="greaterThanOrEqual" constant="400" id="tyS-jD-P69"/>
+                    </constraints>
+                    <textFieldCell key="cell" controlSize="mini" scrollable="YES" lineBreakMode="clipping" selectable="YES" allowsUndo="NO" sendsActionOnEndEditing="YES" allowsEditingTextAttributes="YES" id="O1h-Mo-jaZ">
+                        <font key="font" metaFont="miniSystem"/>
                         <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
                         <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
                     </textFieldCell>
                 </textField>
             </subviews>
+            <constraints>
+                <constraint firstItem="3Ah-G1-XHY" firstAttribute="top" secondItem="pEE-BK-JGJ" secondAttribute="top" id="3hU-qw-HAk"/>
+                <constraint firstItem="3Ah-G1-XHY" firstAttribute="leading" secondItem="pEE-BK-JGJ" secondAttribute="leading" id="6NK-fu-mIA"/>
+                <constraint firstAttribute="bottom" secondItem="3Ah-G1-XHY" secondAttribute="bottom" id="Mrr-0H-44j"/>
+                <constraint firstAttribute="trailing" secondItem="3Ah-G1-XHY" secondAttribute="trailing" id="oHK-WI-zAv"/>
+            </constraints>
         </customView>
         <customView id="NBE-Gf-zLc">
             <rect key="frame" x="0.0" y="0.0" width="150" height="20"/>
@@ -169,17 +169,11 @@
                             <action selector="openSecuritySettings:" target="0yn-TQ-4SC" id="fB4-d2-txt"/>
                         </connections>
                     </toolbarItem>
-                    <toolbarItem implicitItemIdentifier="CCABE25A-70EC-4CDA-9AF2-F274ADECCF13" label="NDN Testbed" paletteLabel="NDN Testbed" tag="-1" image="NSBonjour" id="d6n-eV-ZEN">
-                        <connections>
-                            <action selector="openTestbedSettings:" target="0yn-TQ-4SC" id="w3x-Jk-pgh"/>
-                        </connections>
-                    </toolbarItem>
                 </allowedToolbarItems>
                 <defaultToolbarItems>
                     <toolbarItem reference="Ppn-Fc-Ncg"/>
                     <toolbarItem reference="wWT-fR-d9Z"/>
                     <toolbarItem reference="JtM-k1-dOw"/>
-                    <toolbarItem reference="d6n-eV-ZEN"/>
                 </defaultToolbarItems>
             </toolbar>
             <connections>
@@ -187,18 +181,18 @@
             </connections>
         </window>
         <customView id="A7D-GN-X5W">
-            <rect key="frame" x="0.0" y="0.0" width="480" height="162"/>
+            <rect key="frame" x="0.0" y="0.0" width="480" height="348"/>
             <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
             <subviews>
-                <box autoresizesSubviews="NO" fixedFrame="YES" borderType="line" translatesAutoresizingMaskIntoConstraints="NO" id="dPr-jz-Nc2">
-                    <rect key="frame" x="9" y="48" width="462" height="114"/>
+                <box autoresizesSubviews="NO" borderType="line" titlePosition="noTitle" translatesAutoresizingMaskIntoConstraints="NO" id="dPr-jz-Nc2">
+                    <rect key="frame" x="17" y="227" width="446" height="103"/>
                     <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                     <view key="contentView">
-                        <rect key="frame" x="1" y="1" width="460" height="98"/>
+                        <rect key="frame" x="1" y="1" width="444" height="101"/>
                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                         <subviews>
-                            <button ambiguous="YES" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="pG7-Kv-zmF">
-                                <rect key="frame" x="16" y="72" width="355" height="18"/>
+                            <button translatesAutoresizingMaskIntoConstraints="NO" id="pG7-Kv-zmF">
+                                <rect key="frame" x="16" y="73" width="355" height="18"/>
                                 <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                 <constraints>
                                     <constraint firstAttribute="width" constant="351" id="Tls-yE-o5t"/>
@@ -211,8 +205,8 @@
                                     <binding destination="Hcg-fF-E5x" name="value" keyPath="launchAtLogin" id="wzT-nM-6OY"/>
                                 </connections>
                             </button>
-                            <button ambiguous="YES" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="rXp-X3-HMm">
-                                <rect key="frame" x="16" y="32" width="328" height="18"/>
+                            <button translatesAutoresizingMaskIntoConstraints="NO" id="rXp-X3-HMm">
+                                <rect key="frame" x="16" y="33" width="328" height="18"/>
                                 <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                 <constraints>
                                     <constraint firstAttribute="width" constant="324" id="2lk-MT-GN6"/>
@@ -225,8 +219,19 @@
                                     <action selector="switchSoftwareUpdates:" target="0yn-TQ-4SC" id="Gh4-nv-8N8"/>
                                 </connections>
                             </button>
-                            <button ambiguous="YES" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="pK9-GZ-bQL">
-                                <rect key="frame" x="16" y="52" width="307" height="18"/>
+                            <button translatesAutoresizingMaskIntoConstraints="NO" id="ghB-he-yYe">
+                                <rect key="frame" x="16" y="13" width="328" height="18"/>
+                                <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+                                <constraints>
+                                    <constraint firstAttribute="width" constant="324" id="gqm-z8-Jky"/>
+                                </constraints>
+                                <buttonCell key="cell" type="check" title="Shutdown NDN daemon on exit" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="RDk-08-SU4">
+                                    <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
+                                    <font key="font" metaFont="system"/>
+                                </buttonCell>
+                            </button>
+                            <button translatesAutoresizingMaskIntoConstraints="NO" id="pK9-GZ-bQL">
+                                <rect key="frame" x="16" y="53" width="307" height="18"/>
                                 <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                 <constraints>
                                     <constraint firstAttribute="width" constant="303" id="wbU-qa-bpU"/>
@@ -241,21 +246,70 @@
                             </button>
                         </subviews>
                     </view>
+                    <constraints>
+                        <constraint firstItem="ghB-he-yYe" firstAttribute="leading" secondItem="rXp-X3-HMm" secondAttribute="leading" id="BFt-ZW-DsW"/>
+                        <constraint firstItem="pG7-Kv-zmF" firstAttribute="top" secondItem="dPr-jz-Nc2" secondAttribute="top" constant="11" id="I5K-JB-Pfp"/>
+                        <constraint firstItem="ghB-he-yYe" firstAttribute="top" secondItem="rXp-X3-HMm" secondAttribute="bottom" constant="6" id="SMP-JZ-GZ7"/>
+                        <constraint firstItem="pG7-Kv-zmF" firstAttribute="leading" secondItem="dPr-jz-Nc2" secondAttribute="leading" constant="16" id="TWq-Tm-OI3"/>
+                        <constraint firstAttribute="height" constant="97" id="Usg-Ls-dEh"/>
+                        <constraint firstItem="pK9-GZ-bQL" firstAttribute="leading" secondItem="pG7-Kv-zmF" secondAttribute="leading" id="XfG-T6-Inw"/>
+                        <constraint firstItem="pK9-GZ-bQL" firstAttribute="top" secondItem="pG7-Kv-zmF" secondAttribute="bottom" constant="6" symbolic="YES" id="ZIT-9U-PXF"/>
+                        <constraint firstItem="pK9-GZ-bQL" firstAttribute="leading" secondItem="rXp-X3-HMm" secondAttribute="leading" id="mSy-B4-PiR"/>
+                        <constraint firstItem="rXp-X3-HMm" firstAttribute="top" secondItem="pK9-GZ-bQL" secondAttribute="bottom" constant="6" symbolic="YES" id="v7q-Jw-IZ9"/>
+                    </constraints>
                     <color key="borderColor" white="0.0" alpha="0.41999999999999998" colorSpace="calibratedWhite"/>
                     <color key="fillColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
                 </box>
-                <button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="JtO-ik-OIb">
-                    <rect key="frame" x="308" y="13" width="166" height="32"/>
+                <box autoresizesSubviews="NO" title="Box" borderType="line" titlePosition="noTitle" translatesAutoresizingMaskIntoConstraints="NO" id="p9d-6I-rmw">
+                    <rect key="frame" x="17" y="152" width="446" height="73"/>
                     <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
-                    <buttonCell key="cell" type="push" title="Restart NDN Service" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="5Lu-bh-ybJ">
-                        <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
-                        <font key="font" metaFont="system"/>
-                    </buttonCell>
-                    <connections>
-                        <action selector="restartDaemon:" target="0yn-TQ-4SC" id="bzA-wn-4wL"/>
-                    </connections>
-                </button>
+                    <view key="contentView">
+                        <rect key="frame" x="1" y="1" width="444" height="71"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <subviews>
+                            <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1z4-SK-AWZ">
+                                <rect key="frame" x="12" y="40" width="159" height="17"/>
+                                <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+                                <buttonCell key="cell" type="inline" title="Open Testbed Traffic Map" bezelStyle="inline" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="JCm-AQ-RUD">
+                                    <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                                    <font key="font" metaFont="smallSystemBold"/>
+                                </buttonCell>
+                                <connections>
+                                    <action selector="openTrafficMapPage:" target="0yn-TQ-4SC" id="62g-PA-oMS"/>
+                                </connections>
+                            </button>
+                            <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1EJ-ak-3K9">
+                                <rect key="frame" x="12" y="16" width="178" height="17"/>
+                                <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+                                <buttonCell key="cell" type="inline" title="Open Testbed Routing Status" bezelStyle="inline" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="Ca1-IW-7he">
+                                    <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                                    <font key="font" metaFont="smallSystemBold"/>
+                                </buttonCell>
+                                <connections>
+                                    <action selector="openRoutingStatusPage:" target="0yn-TQ-4SC" id="Nyk-E9-Tvu"/>
+                                </connections>
+                            </button>
+                        </subviews>
+                    </view>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="67" id="9Ku-ah-lJz"/>
+                        <constraint firstItem="1EJ-ak-3K9" firstAttribute="leading" secondItem="p9d-6I-rmw" secondAttribute="leading" constant="10" id="K0k-y0-otc"/>
+                        <constraint firstItem="1z4-SK-AWZ" firstAttribute="top" secondItem="p9d-6I-rmw" secondAttribute="top" constant="13" id="K6t-7A-4Yn"/>
+                        <constraint firstItem="1EJ-ak-3K9" firstAttribute="top" secondItem="1z4-SK-AWZ" secondAttribute="bottom" constant="8" symbolic="YES" id="MUe-Xm-H56"/>
+                        <constraint firstItem="1z4-SK-AWZ" firstAttribute="leading" secondItem="p9d-6I-rmw" secondAttribute="leading" constant="10" id="ZUa-hq-ac4"/>
+                        <constraint firstAttribute="width" constant="440" id="h7G-kI-vYI"/>
+                    </constraints>
+                    <color key="borderColor" white="0.0" alpha="0.41999999999999998" colorSpace="calibratedWhite"/>
+                    <color key="fillColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
+                </box>
             </subviews>
+            <constraints>
+                <constraint firstItem="p9d-6I-rmw" firstAttribute="leading" secondItem="dPr-jz-Nc2" secondAttribute="leading" id="5TL-1f-8Dm"/>
+                <constraint firstItem="p9d-6I-rmw" firstAttribute="top" secondItem="dPr-jz-Nc2" secondAttribute="bottom" constant="8" symbolic="YES" id="FQA-e1-m6K"/>
+                <constraint firstItem="dPr-jz-Nc2" firstAttribute="leading" secondItem="A7D-GN-X5W" secondAttribute="leading" constant="20" symbolic="YES" id="S6R-H9-XPE"/>
+                <constraint firstAttribute="trailing" secondItem="dPr-jz-Nc2" secondAttribute="trailing" constant="20" symbolic="YES" id="You-U1-e60"/>
+                <constraint firstItem="dPr-jz-Nc2" firstAttribute="top" secondItem="A7D-GN-X5W" secondAttribute="top" constant="20" symbolic="YES" id="tuO-bi-DcM"/>
+            </constraints>
         </customView>
         <customView id="lQz-E7-PRx">
             <rect key="frame" x="0.0" y="0.0" width="480" height="253"/>
@@ -483,93 +537,9 @@
             <rect key="frame" x="0.0" y="0.0" width="100" height="100"/>
             <autoresizingMask key="autoresizingMask"/>
         </view>
-        <customView id="Oey-Qd-MNO">
-            <rect key="frame" x="0.0" y="0.0" width="480" height="142"/>
-            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
-            <subviews>
-                <button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="lGF-4w-GUX">
-                    <rect key="frame" x="14" y="54" width="204" height="32"/>
-                    <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
-                    <buttonCell key="cell" type="push" title="Open Testbed Traffic Map" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="kBP-Pw-hK6">
-                        <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
-                        <font key="font" metaFont="system"/>
-                    </buttonCell>
-                    <connections>
-                        <action selector="openTrafficMapPage:" target="0yn-TQ-4SC" id="Sii-pf-rXm"/>
-                    </connections>
-                </button>
-                <button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Yxc-am-NiT">
-                    <rect key="frame" x="241" y="54" width="225" height="32"/>
-                    <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
-                    <buttonCell key="cell" type="push" title="Open Testbed Routing Status" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="EFM-kw-8Gn">
-                        <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
-                        <font key="font" metaFont="system"/>
-                    </buttonCell>
-                    <connections>
-                        <action selector="openRoutingStatusPage:" target="0yn-TQ-4SC" id="Dqm-V8-Bhh"/>
-                    </connections>
-                </button>
-            </subviews>
-        </customView>
-        <window allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" releasedWhenClosed="NO" showsToolbarButton="NO" visibleAtLaunch="NO" animationBehavior="default" id="6NI-pK-JJs">
-            <windowStyleMask key="styleMask" titled="YES"/>
-            <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
-            <rect key="contentRect" x="163" y="199" width="274" height="135"/>
-            <rect key="screenRect" x="0.0" y="0.0" width="1680" height="1028"/>
-            <view key="contentView" id="P0O-3X-rOU">
-                <rect key="frame" x="0.0" y="0.0" width="274" height="135"/>
-                <autoresizingMask key="autoresizingMask"/>
-                <subviews>
-                    <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Hmq-7p-n1o">
-                        <rect key="frame" x="13" y="89" width="248" height="39"/>
-                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
-                        <textFieldCell key="cell" sendsActionOnEndEditing="YES" title="Are you sure you want to quit NDN Control Center?" id="NRV-sz-Mpi">
-                            <font key="font" size="14" name="LucidaGrande-Bold"/>
-                            <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
-                            <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
-                        </textFieldCell>
-                    </textField>
-                    <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="jCI-Hw-kmn">
-                        <rect key="frame" x="13" y="47" width="254" height="34"/>
-                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
-                        <textFieldCell key="cell" sendsActionOnEndEditing="YES" title="This action will shut down NDN Service that leads to loosing NDN connectivity " id="7mB-Qb-ylL">
-                            <font key="font" metaFont="system"/>
-                            <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
-                            <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
-                        </textFieldCell>
-                    </textField>
-                    <button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="9ht-Qr-bcN">
-                        <rect key="frame" x="115" y="0.0" width="82" height="32"/>
-                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
-                        <buttonCell key="cell" type="push" title="Cancel" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="zkT-XH-FNU">
-                            <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
-                            <font key="font" size="14" name="LucidaGrande"/>
-                            <string key="keyEquivalent" base64-UTF8="YES">
-Gw
-</string>
-                        </buttonCell>
-                        <connections>
-                            <action selector="cancelExit:" target="494" id="iQm-vR-TEd"/>
-                        </connections>
-                    </button>
-                    <button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="fq0-RJ-oct">
-                        <rect key="frame" x="203" y="0.0" width="67" height="32"/>
-                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
-                        <buttonCell key="cell" type="push" title="Quit" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="B4Q-jO-cYF">
-                            <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
-                            <font key="font" size="14" name="LucidaGrande"/>
-                        </buttonCell>
-                        <connections>
-                            <action selector="confirmExit:" target="494" id="KqY-nJ-fuh"/>
-                        </connections>
-                    </button>
-                </subviews>
-            </view>
-        </window>
     </objects>
     <resources>
         <image name="NSAdvanced" width="32" height="32"/>
-        <image name="NSBonjour" width="32" height="32"/>
         <image name="NSNetwork" width="32" height="32"/>
         <image name="NSPreferencesGeneral" width="32" height="32"/>
     </resources>
diff --git a/osx/Resources/status.xslt b/osx/Resources/status.xslt
new file mode 100644
index 0000000..4625a82
--- /dev/null
+++ b/osx/Resources/status.xslt
@@ -0,0 +1,28 @@
+<xsl:stylesheet version = '1.0'
+                xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
+
+<xsl:template match="/ndnd">
+<html><body>
+<xsl:apply-templates select="forwarding/fentry" />
+</body></html>
+</xsl:template>
+
+<xsl:template match="fentry">
+<xsl:apply-templates select="dest/faceid" />
+<xsl:text> </xsl:text>
+<xsl:value-of select="prefix"/>
+<br/>
+</xsl:template>
+
+<xsl:template match="faceid">
+<xsl:variable name="id"><xsl:value-of select="." /></xsl:variable>
+<b>face: <xsl:copy-of select="$id" />
+
+<xsl:choose>
+  <xsl:when test="count(//face/ip[../faceid=$id]) &gt; 0"> (<xsl:value-of select="//face/ip[../faceid=$id]" />)
+  </xsl:when>
+  <xsl:otherwise> (app)</xsl:otherwise>
+</xsl:choose></b>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/osx/menu-delegate.h b/osx/menu-delegate.h
index f2b508c..994ed4c 100644
--- a/osx/menu-delegate.h
+++ b/osx/menu-delegate.h
@@ -11,38 +11,45 @@
 
 @interface MenuDelegate : NSObject <NSApplicationDelegate>
 {
-    NSStatusItem *statusItem;
-    NSImage *menuIcon;
+  NSOperationQueue *m_operationQueue;
+  
+  NSStatusItem *statusItem;
 
-    IBOutlet NSPopover *statusPopover;
+  NSImage *m_connectedIcon;
+  NSImage *m_disconnectedIcon;
+  NSData  *m_statusXslt;
 
-    IBOutlet NSMenu *statusMenu;
-    IBOutlet NSMenuItem *connectionStatus;
-    IBOutlet NSMenuItem *startstopButton;
-    IBOutlet NSMenuItem *daemonStatus;
-    IBOutlet NSMenuItem *routingStatus;
-    IBOutlet NSMenuItem *trafficMap;
-    IBOutlet NSMenuItem *ndnPreferences;
+  IBOutlet NSPopover *statusPopover;
+
+  IBOutlet NSMenu *statusMenu;
+  IBOutlet NSMenuItem *connectionStatus;
+  IBOutlet NSMenuItem *startstopButton;
+  IBOutlet NSMenuItem *daemonStatus;
+  IBOutlet NSMenuItem *routingStatus;
+  IBOutlet NSMenuItem *trafficMap;
+  IBOutlet NSMenuItem *ndnPreferences;
   
-    BOOL daemonStarted;
-    BOOL allowSoftwareUpdates;
-    BOOL enableHubDiscovery;
+  BOOL m_daemonStarted;
+  BOOL allowSoftwareUpdates;
+  BOOL enableHubDiscovery;
   
-    IBOutlet NSView *daemonStatusView;
-    IBOutlet NSTextField *daemonStatusText;
+  IBOutlet NSView *daemonStatusView;
+  IBOutlet NSTextField *daemonStatusHtml;
+  IBOutlet NSView *daemonStatusHtmlView;
+  NSAttributedString *m_statusString;
   
-    IBOutlet NSView *connectionStatusView;
-    IBOutlet NSTextField *connectionStatusText;
+  IBOutlet NSView *connectionStatusView;
+  IBOutlet NSTextField *connectionStatusText;
   
-    IBOutlet PreferenceDelegate *preferencesDelegate;
-  
-    IBOutlet NSWindow *exitWindow;
+  IBOutlet PreferenceDelegate *preferencesDelegate;
 }
 
 -(void)menu:(NSMenu *)menu willHighlightItem:(NSMenuItem *)item;
--(IBAction)openDaemonStatus:(id)sender;
 
+-(IBAction)openDaemonStatus:(id)sender;
 -(IBAction)showExitConfirmationWindow:(id)sender;
--(IBAction)confirmExit:(id)sender;
--(IBAction)cancelExit:(id)sender;
+
+- (void)statusUpdated:(NSXMLDocument*)document;
+- (void)statusUnavailable:(id)none;
+
 @end
diff --git a/osx/menu-delegate.mm b/osx/menu-delegate.mm
index c359671..24102fd 100644
--- a/osx/menu-delegate.mm
+++ b/osx/menu-delegate.mm
@@ -8,36 +8,38 @@
 
 #include "config.h"
 #import "menu-delegate.h"
-
-#define NDND_START_COMMAND @ NDNX_ROOT "/bin/ndndstart"
-#define NDND_STOP_COMMAND @ NDNX_ROOT "/bin/ndndstop"
-#define NDND_STATUS_COMMAND @ NDNX_ROOT "/bin/ndndstatus"
+#import "ndnd-status-operation.h"
 
 @implementation MenuDelegate
 
+-(id)init
+{
+  if (![super init]) {
+    return nil;
+  }
+
+  m_operationQueue = [[NSOperationQueue alloc] init];
+  return self;
+}
+
 - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
 {
-  daemonStarted = false;
+  m_daemonStarted = false; 
   allowSoftwareUpdates = true;
   enableHubDiscovery = true;
+
+  NSBundle *bundle = [NSBundle bundleForClass:[self class]];
+  m_connectedIcon = [[NSImage alloc] initWithContentsOfFile:[bundle pathForResource:@"FlatConnected" ofType:@"png"]];
+  m_disconnectedIcon = [[NSImage alloc] initWithContentsOfFile:[bundle pathForResource:@"FlatDisconnected" ofType:@"png"]];
+  m_statusXslt = [NSData dataWithContentsOfFile:[bundle pathForResource:@"status" ofType:@"xslt"]];
   
   NSTimer *t = [NSTimer scheduledTimerWithTimeInterval: 1.0
                       target: self
                       selector:@selector(onTick:)
                       userInfo: nil repeats:YES];
   [[NSRunLoop mainRunLoop] addTimer:t forMode:NSRunLoopCommonModes];
-  
-  daemonStarted = true;
-  [connectionStatusText setStringValue:@"Connected"];
-    
-  NSTask *task = [[NSTask alloc] init];
-  [task setLaunchPath: NDND_START_COMMAND];
-  [task launch];
-    
-  NSBundle *bundle = [NSBundle bundleForClass:[self class]];
-  NSString *path = [bundle pathForResource:@"FlatConnected" ofType:@"png"];
-  menuIcon = [[NSImage alloc] initWithContentsOfFile:path];
-  [statusItem setImage:menuIcon];
+
+  [m_operationQueue addOperation:[[NdndStatusOperation alloc] initWithDelegate:self]];
 }
 
 -(void)awakeFromNib
@@ -49,15 +51,12 @@
   [statusItem setHighlightMode:YES];
   //[statusItem setTarget:self];
 
-  NSBundle *bundle = [NSBundle bundleForClass:[self class]];
-  NSString *path = [bundle pathForResource:@"FlatDisconnected" ofType:@"png"];
-  menuIcon = [[NSImage alloc] initWithContentsOfFile:path];
   [statusItem setTitle:@""];
-  [statusItem setImage:menuIcon];
-  
+  [statusItem setImage:m_disconnectedIcon];
   
   [connectionStatus setView: connectionStatusView];
   [connectionStatus setTarget:self];
+  
   [daemonStatus setView: daemonStatusView];
   [daemonStatus setTarget:self];
 }
@@ -68,18 +67,34 @@
 
 -(IBAction)showExitConfirmationWindow:(id)sender
 {
-  [exitWindow makeKeyAndOrderFront:sender];
-  [exitWindow setLevel: NSStatusWindowLevel];
+  NSAlert *alert = [[NSAlert alloc] init];
+  [alert addButtonWithTitle:@"Yes"];
+  [alert addButtonWithTitle:@"No"];
+  [alert addButtonWithTitle:@"Cancel"];
+  [alert setMessageText:@"Shutdown NDN daemon as well?"];
+  [alert setInformativeText:@"All NDN operations will be become unavailable."];
+  [alert setAlertStyle:NSCriticalAlertStyle];
+  [alert setShowsSuppressionButton: YES];
+
+  NSInteger res = [alert runModal];
+  if (res == NSAlertFirstButtonReturn) {
+    [m_operationQueue cancelAllOperations];
+    [NSApp terminate:self];
+  } else if (res == NSAlertSecondButtonReturn) {
+    [m_operationQueue cancelAllOperations];
+    [NSApp terminate:self];
+  }
 }
 
 -(void)menu:(NSMenu *)menu willHighlightItem:(NSMenuItem *)item
 {
-
   if( ([item view]!=nil) && (item == daemonStatus) )
   {
-    [statusPopover showRelativeToRect:[[item view] bounds]
-                 ofView:[item view]
-                 preferredEdge:NSMinXEdge];
+    NSView *view = [item view];
+    
+    [statusPopover showRelativeToRect:[view bounds]
+                   ofView:view
+                   preferredEdge:NSMinXEdge];
   }
   else
   {
@@ -89,34 +104,42 @@
 
 -(void)onTick:(NSTimer *)timer
 {
-  if (daemonStarted)
-  {
-    NSTask *task = [[NSTask alloc] init];
-    [task setLaunchPath: NDND_STATUS_COMMAND];
+  [m_operationQueue addOperation:[[NdndStatusOperation alloc] initWithDelegate:self]];
+}
+
+- (void)statusUpdated:(NSXMLDocument*)document
+{
+  if (!m_daemonStarted) {
+    m_daemonStarted = true;
+    [connectionStatusText setStringValue:@"Active"];
     
-    NSPipe * out = [NSPipe pipe];
-    [task setStandardOutput:out];
-
-    [task launch];
-    [task waitUntilExit];
-
-    NSFileHandle * read = [out fileHandleForReading];
-    NSData * dataRead = [read readDataToEndOfFile];
-    NSString *stringRead = [[NSString alloc] initWithData:dataRead encoding:NSUTF8StringEncoding];
-  
-    [daemonStatusText setStringValue:stringRead];
+    [statusItem setImage:m_connectedIcon];
   }
+
+  NSXMLDocument *result = [document objectByApplyingXSLT:m_statusXslt
+                           arguments:nil
+                           error:nil];
+
+  m_statusString = [[NSAttributedString alloc]initWithHTML:[result XMLData] documentAttributes:NULL];
+  [daemonStatusHtml setAttributedStringValue:m_statusString];
 }
 
--(IBAction)confirmExit:(id)sender
+- (void)statusUnavailable:(id)none
 {
-  [NSApp terminate:self];
-}
-
--(IBAction)cancelExit:(id)sender
-{
-  if([exitWindow isVisible])
-   [exitWindow orderOut:self];
+  // try start ndnd if it is not started yet
+  if (m_daemonStarted) {
+    m_daemonStarted = false;
+    
+    [connectionStatusText setStringValue:@"Starting..."];
+    
+    [statusItem setImage:m_disconnectedIcon];
+  }
+  
+  [m_operationQueue addOperationWithBlock:^{
+      NSTask *task = [[NSTask alloc] init];
+      [task setLaunchPath: @NDND_START_COMMAND];
+      [task launch];
+    }];
 }
 
 @end
diff --git a/osx/ndnd-status-operation.h b/osx/ndnd-status-operation.h
new file mode 100644
index 0000000..3f440a9
--- /dev/null
+++ b/osx/ndnd-status-operation.h
@@ -0,0 +1,19 @@
+/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
+/*
+ * @copyright See LICENCE for copyright and license information.
+ *
+ * @author Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ * @author Ilya Moiseenko <iliamo@ucla.edu>
+ */
+
+#import <Cocoa/Cocoa.h>
+#import "menu-delegate.h"
+
+@interface NdndStatusOperation : NSOperation
+{
+  MenuDelegate *m_delegate;
+}
+
+-(id)initWithDelegate:(MenuDelegate*)delegate;
+
+@end
diff --git a/osx/ndnd-status-operation.mm b/osx/ndnd-status-operation.mm
new file mode 100644
index 0000000..ab0f303
--- /dev/null
+++ b/osx/ndnd-status-operation.mm
@@ -0,0 +1,57 @@
+/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
+/*
+ * @copyright See LICENCE for copyright and license information.
+ *
+ * @author Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ * @author Ilya Moiseenko <iliamo@ucla.edu>
+ */
+
+#include "config.h"
+#import "ndnd-status-operation.h"
+
+@implementation NdndStatusOperation
+
+-(id)initWithDelegate:(MenuDelegate*)delegate
+{
+  if (![super init]) return nil;
+  m_delegate = delegate;
+  return self;
+}
+
+-(void)main
+{
+  NSTask *task = [[NSTask alloc] init];
+  [task setLaunchPath: @NDND_STATUS_COMMAND];
+  [task setArguments: [NSArray arrayWithObjects: @"status",@"-x",nil]];
+
+  NSPipe * out = [NSPipe pipe];
+  [task setStandardOutput:out];
+
+  [task launch];
+  [task waitUntilExit];
+
+  NSFileHandle * read = [out fileHandleForReading];
+  NSData * dataRead = [read readDataToEndOfFile];
+  NSString *stringRead = [[NSString alloc] initWithData:dataRead encoding:NSUTF8StringEncoding];
+
+  if ([stringRead isEqualToString:@""]) {
+    [m_delegate performSelectorOnMainThread:@selector(statusUnavailable:)
+                                 withObject:nil
+                                 waitUntilDone:YES];
+    
+  } else {
+    NSError *error = nil;
+    NSXMLDocument *document = [[NSXMLDocument alloc]
+                                initWithXMLString:stringRead
+                                          options:0
+                                          error:&error];
+
+    [m_delegate performSelectorOnMainThread:@selector(statusUpdated:)
+                                 withObject:document
+                                 waitUntilDone:YES];
+  }
+  
+  // [daemonStatusText setStringValue:stringRead];
+}
+
+@end
diff --git a/osx/preference-delegate.mm b/osx/preference-delegate.mm
index 0753290..2760908 100644
--- a/osx/preference-delegate.mm
+++ b/osx/preference-delegate.mm
@@ -9,11 +9,6 @@
 #include "config.h"
 #import "preference-delegate.h"
 
-#define NDND_START_COMMAND @ NDNX_ROOT "/bin/ndndstart"
-#define NDND_STOP_COMMAND @ NDNX_ROOT "/bin/ndndstop"
-#define NDND_STATUS_COMMAND @ NDNX_ROOT "/bin/ndndstatus"
-#define NDND_FIB_COMMAND @ NDNX_ROOT "/bin/ndndc"
-
 @implementation PreferenceDelegate
 
 -(IBAction)showPreferencesPanel:(id)sender
@@ -97,7 +92,7 @@
   NSArray *arguments = [NSArray arrayWithObjects: operationName, prefixName, socketType, address, nil];
 
   NSTask *task = [[NSTask alloc] init];
-  [task setLaunchPath: NDND_FIB_COMMAND];
+  [task setLaunchPath: @NDND_FIB_COMMAND];
   [task setArguments: arguments];
   [task launch];
 }
diff --git a/wscript b/wscript
index b1c3f8d..3f1d6a6 100644
--- a/wscript
+++ b/wscript
@@ -24,7 +24,12 @@
         conf.end_msg ('not found, but will proceed anyways', 'YELLOW')
     else:
         conf.end_msg ('ok')
+
     conf.define('NDNX_ROOT', conf.options.ndnx_root)
+    conf.define('NDND_START_COMMAND', '%s/bin/ndndstart' % conf.options.ndnx_root)
+    conf.define('NDND_STOP_COMMAND', '%s/bin/ndndstop' % conf.options.ndnx_root)
+    conf.define('NDND_STATUS_COMMAND', '%s/bin/ndndsmoketest' % conf.options.ndnx_root)
+    conf.define('NDND_FIB_COMMAND',  '%s/bin/ndndc' % conf.options.ndnx_root)
     
     if Utils.unversioned_sys_platform () == "darwin":
         conf.find_program('ibtool', var='IBTOOL', mandatory=False)