diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/HyracksAdminConsole.java b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/HyracksAdminConsole.java
new file mode 100644
index 0000000..587a8a4
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/HyracksAdminConsole.java
@@ -0,0 +1,67 @@
+package edu.uci.ics.hyracks.adminconsole.client;
+
+import com.google.gwt.core.client.EntryPoint;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.uibinder.client.UiBinder;
+import com.google.gwt.uibinder.client.UiField;
+import com.google.gwt.user.client.Window;
+import com.google.gwt.user.client.ui.DockLayoutPanel;
+import com.google.gwt.user.client.ui.RootLayoutPanel;
+
+import edu.uci.ics.hyracks.adminconsole.client.connection.ServerConnection;
+import edu.uci.ics.hyracks.adminconsole.client.panels.ApplicationsPanel;
+import edu.uci.ics.hyracks.adminconsole.client.panels.DashboardPanel;
+import edu.uci.ics.hyracks.adminconsole.client.panels.JobsPanel;
+import edu.uci.ics.hyracks.adminconsole.client.panels.NodeControllersPanel;
+import edu.uci.ics.hyracks.adminconsole.client.panels.TopPanel;
+
+public class HyracksAdminConsole implements EntryPoint {
+    public static HyracksAdminConsole INSTANCE;
+
+    private final Messages messages = GWT.create(Messages.class);
+
+    private ServerConnection serverConnection;
+
+    @UiField
+    TopPanel topPanel;
+
+    @UiField
+    DashboardPanel dashboardPanel;
+
+    @UiField
+    ApplicationsPanel applicationsPanel;
+
+    @UiField
+    NodeControllersPanel nodeControllersPanel;
+
+    @UiField
+    JobsPanel jobsPanel;
+
+    interface Binder extends UiBinder<DockLayoutPanel, HyracksAdminConsole> {
+    }
+
+    private final static Binder binder = GWT.create(Binder.class);
+
+    public ServerConnection getServerConnection() {
+        return serverConnection;
+    }
+
+    public void onModuleLoad() {
+        INSTANCE = this;
+        serverConnection = new ServerConnection();
+        String serverURLPrefix = Window.Location.getParameter("cclocation");
+        serverConnection.setServerURLPrefix(serverURLPrefix);
+
+        DockLayoutPanel lp = binder.createAndBindUi(this);
+
+        // Get rid of scrollbars, and clear out the window's built-in margin,
+        // because we want to take advantage of the entire client area.
+        Window.enableScrolling(false);
+        Window.setMargin("0px");
+
+        // Add the outer panel to the RootLayoutPanel, so that it will be
+        // displayed.
+        RootLayoutPanel root = RootLayoutPanel.get();
+        root.add(lp);
+    }
+}
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/HyracksAdminConsole.ui.xml b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/HyracksAdminConsole.ui.xml
new file mode 100644
index 0000000..929e1de
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/HyracksAdminConsole.ui.xml
@@ -0,0 +1,44 @@
+<!DOCTYPE ui:UiBinder
+  SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"
+>
+<ui:UiBinder
+  xmlns:ui='urn:ui:com.google.gwt.uibinder'
+  xmlns:g='urn:import:com.google.gwt.user.client.ui'
+  xmlns:hac.panels='urn:import:edu.uci.ics.hyracks.adminconsole.client.panels'>
+
+  <g:DockLayoutPanel unit='EM'>
+    <g:north size='5'>
+      <hac.panels:TopPanel ui:field='topPanel' />
+    </g:north>
+
+    <g:center>
+      <g:TabLayoutPanel barUnit="EM" barHeight="2">
+        <g:tab>
+          <g:header>
+            Dashboard
+          </g:header>
+          <hac.panels:DashboardPanel ui:field='dashboardPanel' />
+        </g:tab>
+        <g:tab>
+          <g:header>
+            Applications
+          </g:header>
+          <hac.panels:ApplicationsPanel ui:field='applicationsPanel' />
+        </g:tab>
+        <g:tab>
+          <g:header>
+            Node Controllers
+          </g:header>
+          <hac.panels:NodeControllersPanel ui:field='nodeControllersPanel' />
+        </g:tab>
+        <g:tab>
+          <g:header>
+            Jobs
+          </g:header>
+          <hac.panels:JobsPanel ui:field='jobsPanel' />
+        </g:tab>
+      </g:TabLayoutPanel>
+    </g:center>
+  </g:DockLayoutPanel>
+
+</ui:UiBinder>
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/beans/JobSummary.java b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/beans/JobSummary.java
new file mode 100644
index 0000000..d7af7f7
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/beans/JobSummary.java
@@ -0,0 +1,46 @@
+package edu.uci.ics.hyracks.adminconsole.client.beans;
+
+import com.google.gwt.core.client.JavaScriptObject;
+import com.google.gwt.view.client.ProvidesKey;
+
+public final class JobSummary extends JavaScriptObject {
+    public static final ProvidesKey<JobSummary> KEY_PROVIDER = new ProvidesKey<JobSummary>() {
+        @Override
+        public Object getKey(JobSummary item) {
+            return item.getJobId();
+        }
+    };
+
+    protected JobSummary() {
+    }
+
+    public native String getJobId()
+    /*-{
+         return this["job-id"];
+    }-*/;
+
+    public native String getApplicationName()
+    /*-{
+         return this["application-name"];
+    }-*/;
+
+    public native String getStatus()
+    /*-{
+         return this.status;
+    }-*/;
+
+    public native Long getCreateTime()
+    /*-{
+         return this["create-time"];
+    }-*/;
+
+    public native Long getStartTime()
+    /*-{
+         return this["start-time"];
+    }-*/;
+
+    public native Long getEndTime()
+    /*-{
+         return this["end-time"];
+    }-*/;
+}
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/beans/NodeDetails.java b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/beans/NodeDetails.java
new file mode 100644
index 0000000..d04c02c
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/beans/NodeDetails.java
@@ -0,0 +1,101 @@
+package edu.uci.ics.hyracks.adminconsole.client.beans;
+
+import com.google.gwt.core.client.JavaScriptObject;
+import com.google.gwt.core.client.JsArrayInteger;
+import com.google.gwt.core.client.JsArrayNumber;
+
+public final class NodeDetails extends JavaScriptObject {
+    protected NodeDetails() {
+
+    }
+
+    public native String getNodeId()
+    /*-{
+         return this["node-id"];
+    }-*/;
+
+    public native String getOSName()
+    /*-{
+         return this["os-name"];
+    }-*/;
+
+    public native String getArch()
+    /*-{
+         return this["arch"];
+    }-*/;
+
+    public native String getOSVersion()
+    /*-{
+         return this["os-version"];
+    }-*/;
+
+    public native int getNProcessors()
+    /*-{
+         return this["num-processors"];
+    }-*/;
+
+    public native int getRRDPtr()
+    /*-{
+         return this["rrd-ptr"];
+    }-*/;
+
+    public native JsArrayNumber getHeartbeatTimes()
+    /*-{
+         return this["heartbeat-times"];
+    }-*/;
+
+    public native JsArrayNumber getHeapInitSizes()
+    /*-{
+         return this["heap-init-sizes"];
+    }-*/;
+
+    public native JsArrayNumber getHeapUsedSizes()
+    /*-{
+         return this["heap-used-sizes"];
+    }-*/;
+
+    public native JsArrayNumber getHeapCommittedSizes()
+    /*-{
+         return this["heap-committed-sizes"];
+    }-*/;
+
+    public native JsArrayNumber getHeapMaxSizes()
+    /*-{
+         return this["heap-max-sizes"];
+    }-*/;
+
+    public native JsArrayNumber getNonHeapInitSizes()
+    /*-{
+         return this["nonheap-init-sizes"];
+    }-*/;
+
+    public native JsArrayNumber getNonHeapUsedSizes()
+    /*-{
+         return this["nonheap-used-sizes"];
+    }-*/;
+
+    public native JsArrayNumber getNonHeapCommittedSizes()
+    /*-{
+         return this["nonheap-committed-sizes"];
+    }-*/;
+
+    public native JsArrayNumber getNonHeapMaxSizes()
+    /*-{
+         return this["nonheap-max-sizes"];
+    }-*/;
+
+    public native JsArrayInteger getThreadCounts()
+    /*-{
+         return this["thread-counts"];
+    }-*/;
+
+    public native JsArrayInteger getPeakThreadCounts()
+    /*-{
+         return this["peak-thread-counts"];
+    }-*/;
+
+    public native JsArrayNumber getSystemLoadAverages()
+    /*-{
+         return this["system-load-averages"];
+    }-*/;
+}
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/beans/NodeSummary.java b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/beans/NodeSummary.java
new file mode 100644
index 0000000..1ee5e85
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/beans/NodeSummary.java
@@ -0,0 +1,37 @@
+package edu.uci.ics.hyracks.adminconsole.client.beans;
+
+import com.google.gwt.core.client.JavaScriptObject;
+import com.google.gwt.core.client.JsArray;
+import com.google.gwt.view.client.ProvidesKey;
+
+public final class NodeSummary extends JavaScriptObject {
+    public static final ProvidesKey<NodeSummary> KEY_PROVIDER = new ProvidesKey<NodeSummary>() {
+        @Override
+        public Object getKey(NodeSummary item) {
+            return item.getNodeId();
+        }
+    };
+
+    protected NodeSummary() {
+    }
+
+    public native String getNodeId()
+    /*-{
+         return this["node-id"];
+    }-*/;
+
+    public native Double getSystemLoadAverage()
+    /*-{
+         return this["system-load-average"];
+    }-*/;
+
+    public native Long getHeapUsed()
+    /*-{
+         return this["heap-used"];
+    }-*/;
+
+    public static native JsArray<NodeSummary> parseNodeSummariesResult(String json)
+    /*-{
+        return eval(json)[0].result;
+     }-*/;
+}
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/connection/ServerConnection.java b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/connection/ServerConnection.java
new file mode 100644
index 0000000..0d147c6
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/connection/ServerConnection.java
@@ -0,0 +1,16 @@
+package edu.uci.ics.hyracks.adminconsole.client.connection;
+
+public class ServerConnection {
+    private String serverURLPrefix;
+
+    public ServerConnection() {
+    }
+
+    public String getServerURLPrefix() {
+        return serverURLPrefix;
+    }
+
+    public void setServerURLPrefix(String serverURLPrefix) {
+        this.serverURLPrefix = serverURLPrefix;
+    }
+}
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/details/node/charts/MemoryUsageChart.java b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/details/node/charts/MemoryUsageChart.java
new file mode 100644
index 0000000..dbc670f
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/details/node/charts/MemoryUsageChart.java
@@ -0,0 +1,51 @@
+package edu.uci.ics.hyracks.adminconsole.client.details.node.charts;
+
+import com.google.gwt.core.client.JsArrayNumber;
+import com.googlecode.gchart.client.GChart;
+
+public class MemoryUsageChart extends GChart {
+    private String prefix;
+
+    public MemoryUsageChart() {
+        setChartSize(720, 200);
+        setPadding("30px");
+    }
+
+    public void setPrefix(String prefix) {
+        this.prefix = prefix;
+    }
+
+    public void reset(int rrdPtr, JsArrayNumber times, JsArrayNumber initSizes, JsArrayNumber usedSizes,
+            JsArrayNumber committedSizes, JsArrayNumber maxSizes) {
+        clearCurves();
+        addCurve();
+        getCurve().setLegendLabel(prefix + " Initial Size");
+        getCurve().getSymbol().setWidth(0);
+        getCurve().getSymbol().setHeight(0);
+        getCurve().getSymbol().setSymbolType(SymbolType.LINE);
+        addCurve();
+        getCurve().setLegendLabel(prefix + " Used Size");
+        getCurve().getSymbol().setWidth(0);
+        getCurve().getSymbol().setHeight(0);
+        getCurve().getSymbol().setSymbolType(SymbolType.LINE);
+        addCurve();
+        getCurve().setLegendLabel(prefix + " Committed Size");
+        getCurve().getSymbol().setWidth(0);
+        getCurve().getSymbol().setHeight(0);
+        getCurve().getSymbol().setSymbolType(SymbolType.LINE);
+        addCurve();
+        getCurve().setLegendLabel(prefix + " Maximum Size");
+        getCurve().getSymbol().setWidth(0);
+        getCurve().getSymbol().setHeight(0);
+        getCurve().getSymbol().setSymbolType(SymbolType.LINE);
+        int ptr = rrdPtr;
+        for (int i = 0; i < times.length(); ++i) {
+            getCurve(0).addPoint(i, initSizes.get(ptr));
+            getCurve(1).addPoint(i, usedSizes.get(ptr));
+            getCurve(2).addPoint(i, committedSizes.get(ptr));
+            getCurve(3).addPoint(i, maxSizes.get(ptr));
+            ptr = (ptr + 1) % times.length();
+        }
+        update();
+    }
+}
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/details/node/charts/SystemLoadAverageChart.java b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/details/node/charts/SystemLoadAverageChart.java
new file mode 100644
index 0000000..21faf21
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/details/node/charts/SystemLoadAverageChart.java
@@ -0,0 +1,26 @@
+package edu.uci.ics.hyracks.adminconsole.client.details.node.charts;
+
+import com.google.gwt.core.client.JsArrayNumber;
+import com.googlecode.gchart.client.GChart;
+
+public class SystemLoadAverageChart extends GChart {
+    public SystemLoadAverageChart() {
+        setChartSize(720, 200);
+        setPadding("30px");
+    }
+
+    public void reset(int rrdPtr, JsArrayNumber times, JsArrayNumber systemLoadAverages) {
+        clearCurves();
+        addCurve();
+        getCurve().setLegendLabel("System Load Average");
+        getCurve().getSymbol().setWidth(0);
+        getCurve().getSymbol().setHeight(0);
+        getCurve().getSymbol().setSymbolType(SymbolType.LINE);
+        int ptr = rrdPtr;
+        for (int i = 0; i < times.length(); ++i) {
+            getCurve().addPoint(i, systemLoadAverages.get(ptr));
+            ptr = (ptr + 1) % times.length();
+        }
+        update();
+    }
+}
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/details/node/charts/ThreadCountChart.java b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/details/node/charts/ThreadCountChart.java
new file mode 100644
index 0000000..77b6b8c
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/details/node/charts/ThreadCountChart.java
@@ -0,0 +1,33 @@
+package edu.uci.ics.hyracks.adminconsole.client.details.node.charts;
+
+import com.google.gwt.core.client.JsArrayInteger;
+import com.google.gwt.core.client.JsArrayNumber;
+import com.googlecode.gchart.client.GChart;
+
+public class ThreadCountChart extends GChart {
+    public ThreadCountChart() {
+        setChartSize(720, 200);
+        setPadding("30px");
+    }
+
+    public void reset(int rrdPtr, JsArrayNumber times, JsArrayInteger threadCounts, JsArrayInteger peakThreadCounts) {
+        clearCurves();
+        addCurve();
+        getCurve().setLegendLabel("Thread Count");
+        getCurve().getSymbol().setWidth(0);
+        getCurve().getSymbol().setHeight(0);
+        getCurve().getSymbol().setSymbolType(SymbolType.LINE);
+        addCurve();
+        getCurve().setLegendLabel("Peak Thread Count");
+        getCurve().getSymbol().setWidth(0);
+        getCurve().getSymbol().setHeight(0);
+        getCurve().getSymbol().setSymbolType(SymbolType.LINE);
+        int ptr = rrdPtr;
+        for (int i = 0; i < times.length(); ++i) {
+            getCurve(0).addPoint(i, threadCounts.get(ptr));
+            getCurve(1).addPoint(i, peakThreadCounts.get(ptr));
+            ptr = (ptr + 1) % times.length();
+        }
+        update();
+    }
+}
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/ApplicationsPanel.java b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/ApplicationsPanel.java
new file mode 100644
index 0000000..f25ea7f
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/ApplicationsPanel.java
@@ -0,0 +1,17 @@
+package edu.uci.ics.hyracks.adminconsole.client.panels;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.uibinder.client.UiBinder;
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.Widget;
+
+public class ApplicationsPanel extends Composite {
+    interface Binder extends UiBinder<Widget, ApplicationsPanel> {
+    }
+
+    private final static Binder binder = GWT.create(Binder.class);
+
+    public ApplicationsPanel() {
+        initWidget(binder.createAndBindUi(this));
+    }
+}
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/ApplicationsPanel.ui.xml b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/ApplicationsPanel.ui.xml
new file mode 100644
index 0000000..74669b0
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/ApplicationsPanel.ui.xml
@@ -0,0 +1,9 @@
+<!DOCTYPE ui:UiBinder
+  SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"
+>
+<ui:UiBinder
+  xmlns:ui='urn:ui:com.google.gwt.uibinder'
+  xmlns:g='urn:import:com.google.gwt.user.client.ui'
+  xmlns:hac.panels='urn:import:edu.uci.ics.hyracks.adminconsole.client.panels'>
+  <g:HTML></g:HTML>
+</ui:UiBinder>
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/DashboardPanel.java b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/DashboardPanel.java
new file mode 100644
index 0000000..6917090
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/DashboardPanel.java
@@ -0,0 +1,17 @@
+package edu.uci.ics.hyracks.adminconsole.client.panels;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.uibinder.client.UiBinder;
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.Widget;
+
+public class DashboardPanel extends Composite {
+    interface Binder extends UiBinder<Widget, DashboardPanel> {
+    }
+
+    private final static Binder binder = GWT.create(Binder.class);
+
+    public DashboardPanel() {
+        initWidget(binder.createAndBindUi(this));
+    }
+}
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/DashboardPanel.ui.xml b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/DashboardPanel.ui.xml
new file mode 100644
index 0000000..74669b0
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/DashboardPanel.ui.xml
@@ -0,0 +1,9 @@
+<!DOCTYPE ui:UiBinder
+  SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"
+>
+<ui:UiBinder
+  xmlns:ui='urn:ui:com.google.gwt.uibinder'
+  xmlns:g='urn:import:com.google.gwt.user.client.ui'
+  xmlns:hac.panels='urn:import:edu.uci.ics.hyracks.adminconsole.client.panels'>
+  <g:HTML></g:HTML>
+</ui:UiBinder>
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/JobsPanel.java b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/JobsPanel.java
new file mode 100644
index 0000000..c8350dc
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/JobsPanel.java
@@ -0,0 +1,82 @@
+package edu.uci.ics.hyracks.adminconsole.client.panels;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JsArray;
+import com.google.gwt.http.client.RequestException;
+import com.google.gwt.uibinder.client.UiBinder;
+import com.google.gwt.uibinder.client.UiField;
+import com.google.gwt.user.client.Timer;
+import com.google.gwt.user.client.Window;
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.SplitLayoutPanel;
+import com.google.gwt.user.client.ui.Widget;
+import com.google.gwt.view.client.AsyncDataProvider;
+
+import edu.uci.ics.hyracks.adminconsole.client.beans.JobSummary;
+import edu.uci.ics.hyracks.adminconsole.client.rest.AbstractRestFunction;
+import edu.uci.ics.hyracks.adminconsole.client.rest.GetJobSummariesFunction;
+import edu.uci.ics.hyracks.adminconsole.client.widgets.JobsTableWidget;
+
+public class JobsPanel extends Composite implements JobsTableWidget.IRefreshRequestHandler {
+    interface Binder extends UiBinder<Widget, JobsPanel> {
+    }
+
+    private final static Binder binder = GWT.create(Binder.class);
+
+    @UiField
+    SplitLayoutPanel split;
+
+    @UiField
+    JobsTableWidget jobs;
+
+    @UiField
+    Widget details;
+
+    private int callCounter;
+
+    public JobsPanel() {
+        initWidget(binder.createAndBindUi(this));
+
+        jobs.setRefreshRequestHandler(this);
+
+        Timer timer = new Timer() {
+            @Override
+            public void run() {
+                refresh();
+            }
+        };
+        refresh();
+        timer.scheduleRepeating(5000);
+    }
+
+    @Override
+    public void refresh() {
+        try {
+            final int counter = ++callCounter;
+            GetJobSummariesFunction.INSTANCE.call(new AbstractRestFunction.ResultCallback<JsArray<JobSummary>>() {
+                @Override
+                public void onSuccess(JsArray<JobSummary> result) {
+                    if (counter == callCounter) {
+                        AsyncDataProvider<JobSummary> dataProvider = jobs.getDataProvider();
+                        List<JobSummary> data = new ArrayList<JobSummary>();
+                        for (int i = 0; i < result.length(); ++i) {
+                            data.add(result.get(i));
+                        }
+                        dataProvider.updateRowData(0, data);
+                        dataProvider.updateRowCount(result.length(), true);
+                    }
+                }
+
+                @Override
+                public void onError(Throwable exception) {
+
+                }
+            });
+        } catch (RequestException e) {
+            e.printStackTrace();
+        }
+    }
+}
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/JobsPanel.ui.xml b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/JobsPanel.ui.xml
new file mode 100644
index 0000000..c12640f
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/JobsPanel.ui.xml
@@ -0,0 +1,18 @@
+<!DOCTYPE ui:UiBinder
+  SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"
+>
+<ui:UiBinder
+  xmlns:ui='urn:ui:com.google.gwt.uibinder'
+  xmlns:g='urn:import:com.google.gwt.user.client.ui'
+  xmlns:widgets='urn:import:edu.uci.ics.hyracks.adminconsole.client.widgets'>
+  <g:SplitLayoutPanel ui:field="split">
+    <g:north size="300">
+      <g:ScrollPanel>
+        <widgets:JobsTableWidget ui:field="jobs" width="100%" height="300px"></widgets:JobsTableWidget>
+      </g:ScrollPanel>    
+    </g:north>
+    <g:center>
+      <g:HTML ui:field="details"></g:HTML>
+    </g:center>
+  </g:SplitLayoutPanel>
+</ui:UiBinder>
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/NodeControllerDetailsPanel.java b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/NodeControllerDetailsPanel.java
new file mode 100644
index 0000000..bbc08d4
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/NodeControllerDetailsPanel.java
@@ -0,0 +1,91 @@
+package edu.uci.ics.hyracks.adminconsole.client.panels;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.http.client.RequestException;
+import com.google.gwt.uibinder.client.UiBinder;
+import com.google.gwt.uibinder.client.UiField;
+import com.google.gwt.user.client.Timer;
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.Widget;
+
+import edu.uci.ics.hyracks.adminconsole.client.beans.NodeDetails;
+import edu.uci.ics.hyracks.adminconsole.client.details.node.charts.MemoryUsageChart;
+import edu.uci.ics.hyracks.adminconsole.client.details.node.charts.SystemLoadAverageChart;
+import edu.uci.ics.hyracks.adminconsole.client.details.node.charts.ThreadCountChart;
+import edu.uci.ics.hyracks.adminconsole.client.rest.AbstractRestFunction;
+import edu.uci.ics.hyracks.adminconsole.client.rest.GetNodeDetailsFunction;
+
+public class NodeControllerDetailsPanel extends Composite {
+    interface Binder extends UiBinder<Widget, NodeControllerDetailsPanel> {
+    }
+
+    private final static Binder binder = GWT.create(Binder.class);
+
+    private final String nodeId;
+
+    @UiField
+    MemoryUsageChart heapUsage;
+
+    @UiField
+    MemoryUsageChart nonheapUsage;
+
+    @UiField
+    SystemLoadAverageChart loadAverage;
+
+    @UiField
+    ThreadCountChart threadCount;
+
+    private int callCounter;
+
+    private Timer timer;
+
+    public NodeControllerDetailsPanel(String nodeId) {
+        initWidget(binder.createAndBindUi(this));
+
+        this.nodeId = nodeId;
+        heapUsage.setPrefix("Heap ");
+        nonheapUsage.setPrefix("Non-Heap ");
+
+        timer = new Timer() {
+            @Override
+            public void run() {
+                refresh();
+            }
+        };
+        refresh();
+        timer.scheduleRepeating(10000);
+    }
+
+    public void destroy() {
+        timer.cancel();
+    }
+
+    private void refresh() {
+        try {
+            final int counter = ++callCounter;
+            new GetNodeDetailsFunction(nodeId).call(new AbstractRestFunction.ResultCallback<NodeDetails>() {
+                @Override
+                public void onSuccess(NodeDetails result) {
+                    if (counter == callCounter) {
+                        loadAverage.reset(result.getRRDPtr(), result.getHeartbeatTimes(),
+                                result.getSystemLoadAverages());
+                        heapUsage.reset(result.getRRDPtr(), result.getHeartbeatTimes(), result.getHeapInitSizes(),
+                                result.getHeapUsedSizes(), result.getHeapCommittedSizes(), result.getHeapMaxSizes());
+                        nonheapUsage.reset(result.getRRDPtr(), result.getHeartbeatTimes(),
+                                result.getNonHeapInitSizes(), result.getNonHeapUsedSizes(),
+                                result.getNonHeapCommittedSizes(), result.getNonHeapMaxSizes());
+                        threadCount.reset(result.getRRDPtr(), result.getHeartbeatTimes(), result.getThreadCounts(),
+                                result.getPeakThreadCounts());
+                    }
+                }
+
+                @Override
+                public void onError(Throwable exception) {
+
+                }
+            });
+        } catch (RequestException e) {
+            e.printStackTrace();
+        }
+    }
+}
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/NodeControllerDetailsPanel.ui.xml b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/NodeControllerDetailsPanel.ui.xml
new file mode 100644
index 0000000..4506f2b
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/NodeControllerDetailsPanel.ui.xml
@@ -0,0 +1,37 @@
+<!DOCTYPE ui:UiBinder
+  SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"
+>
+<ui:UiBinder
+  xmlns:ui='urn:ui:com.google.gwt.uibinder'
+  xmlns:g='urn:import:com.google.gwt.user.client.ui'
+  xmlns:charts='urn:import:edu.uci.ics.hyracks.adminconsole.client.details.node.charts'>
+  <g:StackLayoutPanel unit="EM">
+    <g:stack>
+      <g:header size="2">
+        System Load
+      </g:header>
+      <g:ScrollPanel>
+        <charts:SystemLoadAverageChart ui:field="loadAverage"/>
+      </g:ScrollPanel>
+    </g:stack>
+    <g:stack>
+      <g:header size="2">
+        Memory Usage
+      </g:header>
+      <g:ScrollPanel>
+        <g:FlowPanel>
+          <charts:MemoryUsageChart ui:field="heapUsage"/>
+          <charts:MemoryUsageChart ui:field="nonheapUsage"/>
+        </g:FlowPanel>
+      </g:ScrollPanel>
+    </g:stack>
+    <g:stack>
+      <g:header size="2">
+        Thread Count
+      </g:header>
+      <g:ScrollPanel>
+        <charts:ThreadCountChart ui:field="threadCount"/>
+      </g:ScrollPanel>
+    </g:stack>
+  </g:StackLayoutPanel>
+</ui:UiBinder>
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/NodeControllersPanel.java b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/NodeControllersPanel.java
new file mode 100644
index 0000000..6110d17
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/NodeControllersPanel.java
@@ -0,0 +1,92 @@
+package edu.uci.ics.hyracks.adminconsole.client.panels;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JsArray;
+import com.google.gwt.http.client.RequestException;
+import com.google.gwt.uibinder.client.UiBinder;
+import com.google.gwt.uibinder.client.UiField;
+import com.google.gwt.user.client.Timer;
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.SplitLayoutPanel;
+import com.google.gwt.user.client.ui.Widget;
+import com.google.gwt.view.client.AsyncDataProvider;
+
+import edu.uci.ics.hyracks.adminconsole.client.beans.NodeSummary;
+import edu.uci.ics.hyracks.adminconsole.client.rest.AbstractRestFunction;
+import edu.uci.ics.hyracks.adminconsole.client.rest.GetNodeSummariesFunction;
+import edu.uci.ics.hyracks.adminconsole.client.widgets.NodesTableWidget;
+
+public class NodeControllersPanel extends Composite implements NodesTableWidget.IRefreshRequestHandler {
+    interface Binder extends UiBinder<Widget, NodeControllersPanel> {
+    }
+
+    private final static Binder binder = GWT.create(Binder.class);
+
+    @UiField
+    SplitLayoutPanel split;
+
+    @UiField
+    NodesTableWidget nodes;
+
+    @UiField
+    Widget details;
+
+    private int callCounter;
+
+    public NodeControllersPanel() {
+        initWidget(binder.createAndBindUi(this));
+
+        nodes.setRefreshRequestHandler(this);
+        nodes.setClickListener(new NodesTableWidget.IClickListener() {
+            @Override
+            public void click(String nodeId) {
+                if (details instanceof NodeControllerDetailsPanel) {
+                    ((NodeControllerDetailsPanel) details).destroy();
+                }
+                split.remove(details);
+                details = new NodeControllerDetailsPanel(nodeId);
+                split.add(details);
+            }
+        });
+
+        Timer timer = new Timer() {
+            @Override
+            public void run() {
+                refresh();
+            }
+        };
+        refresh();
+        timer.scheduleRepeating(10000);
+    }
+
+    @Override
+    public void refresh() {
+        try {
+            final int counter = ++callCounter;
+            GetNodeSummariesFunction.INSTANCE.call(new AbstractRestFunction.ResultCallback<JsArray<NodeSummary>>() {
+                @Override
+                public void onSuccess(JsArray<NodeSummary> result) {
+                    if (counter == callCounter) {
+                        AsyncDataProvider<NodeSummary> dataProvider = nodes.getDataProvider();
+                        List<NodeSummary> data = new ArrayList<NodeSummary>();
+                        for (int i = 0; i < result.length(); ++i) {
+                            data.add(result.get(i));
+                        }
+                        dataProvider.updateRowData(0, data);
+                        dataProvider.updateRowCount(result.length(), true);
+                    }
+                }
+
+                @Override
+                public void onError(Throwable exception) {
+
+                }
+            });
+        } catch (RequestException e) {
+            e.printStackTrace();
+        }
+    }
+}
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/NodeControllersPanel.ui.xml b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/NodeControllersPanel.ui.xml
new file mode 100644
index 0000000..80b4148
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/NodeControllersPanel.ui.xml
@@ -0,0 +1,18 @@
+<!DOCTYPE ui:UiBinder
+  SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"
+>
+<ui:UiBinder
+  xmlns:ui='urn:ui:com.google.gwt.uibinder'
+  xmlns:g='urn:import:com.google.gwt.user.client.ui'
+  xmlns:widgets='urn:import:edu.uci.ics.hyracks.adminconsole.client.widgets'>
+  <g:SplitLayoutPanel ui:field="split">
+    <g:west size="300">
+      <g:ScrollPanel>
+        <widgets:NodesTableWidget ui:field="nodes" width="100%"></widgets:NodesTableWidget>
+      </g:ScrollPanel>    
+    </g:west>
+    <g:center>
+      <g:HTML ui:field="details"></g:HTML>
+    </g:center>
+  </g:SplitLayoutPanel>
+</ui:UiBinder>
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/TopPanel.java b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/TopPanel.java
new file mode 100644
index 0000000..a849615
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/TopPanel.java
@@ -0,0 +1,17 @@
+package edu.uci.ics.hyracks.adminconsole.client.panels;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.uibinder.client.UiBinder;
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.Widget;
+
+public class TopPanel extends Composite {
+    interface Binder extends UiBinder<Widget, TopPanel> {
+    }
+
+    private final static Binder binder = GWT.create(Binder.class);
+
+    public TopPanel() {
+        initWidget(binder.createAndBindUi(this));
+    }
+}
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/TopPanel.ui.xml b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/TopPanel.ui.xml
new file mode 100644
index 0000000..71c7b24
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/panels/TopPanel.ui.xml
@@ -0,0 +1,15 @@
+<!DOCTYPE ui:UiBinder
+  SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"
+>
+<ui:UiBinder
+  xmlns:ui='urn:ui:com.google.gwt.uibinder'
+  xmlns:g='urn:import:com.google.gwt.user.client.ui'
+  xmlns:mail='urn:import:com.google.gwt.sample.mail.client'>
+
+  <ui:style>
+
+  </ui:style>
+
+  <g:HTMLPanel>
+  </g:HTMLPanel>
+</ui:UiBinder>
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/rest/AbstractRestFunction.java b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/rest/AbstractRestFunction.java
new file mode 100644
index 0000000..6297fd2
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/rest/AbstractRestFunction.java
@@ -0,0 +1,47 @@
+package edu.uci.ics.hyracks.adminconsole.client.rest;
+
+import com.google.gwt.http.client.Request;
+import com.google.gwt.http.client.RequestBuilder;
+import com.google.gwt.http.client.RequestCallback;
+import com.google.gwt.http.client.RequestException;
+import com.google.gwt.http.client.Response;
+import com.google.gwt.http.client.URL;
+
+import edu.uci.ics.hyracks.adminconsole.client.HyracksAdminConsole;
+
+public abstract class AbstractRestFunction<T> {
+    protected abstract void appendURLPath(StringBuilder buffer);
+
+    protected native T packageResults(String result)
+    /*-{
+        return eval("[" + result + "]")[0].result;
+    }-*/;
+
+    public interface ResultCallback<T> {
+        public void onSuccess(T result);
+
+        public void onError(Throwable exception);
+    }
+
+    public void call(final ResultCallback<T> callback) throws RequestException {
+        StringBuilder buffer = new StringBuilder();
+        buffer.append(HyracksAdminConsole.INSTANCE.getServerConnection().getServerURLPrefix());
+        buffer.append("/rest");
+        appendURLPath(buffer);
+        RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, URL.encode(buffer.toString()));
+
+        builder.sendRequest(null, new RequestCallback() {
+            public void onError(Request request, Throwable exception) {
+                callback.onError(exception);
+            }
+
+            public void onResponseReceived(Request request, Response response) {
+                if (200 == response.getStatusCode()) {
+                    callback.onSuccess(packageResults(response.getText()));
+                } else {
+                    callback.onError(null);
+                }
+            }
+        });
+    }
+}
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/rest/GetJobSummariesFunction.java b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/rest/GetJobSummariesFunction.java
new file mode 100644
index 0000000..e96bc22
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/rest/GetJobSummariesFunction.java
@@ -0,0 +1,17 @@
+package edu.uci.ics.hyracks.adminconsole.client.rest;
+
+import com.google.gwt.core.client.JsArray;
+
+import edu.uci.ics.hyracks.adminconsole.client.beans.JobSummary;
+
+public class GetJobSummariesFunction extends AbstractRestFunction<JsArray<JobSummary>> {
+    public static final GetJobSummariesFunction INSTANCE = new GetJobSummariesFunction();
+
+    private GetJobSummariesFunction() {
+    }
+
+    @Override
+    protected void appendURLPath(StringBuilder buffer) {
+        buffer.append("/jobs");
+    }
+}
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/rest/GetNodeDetailsFunction.java b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/rest/GetNodeDetailsFunction.java
new file mode 100644
index 0000000..b535ffc
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/rest/GetNodeDetailsFunction.java
@@ -0,0 +1,16 @@
+package edu.uci.ics.hyracks.adminconsole.client.rest;
+
+import edu.uci.ics.hyracks.adminconsole.client.beans.NodeDetails;
+
+public class GetNodeDetailsFunction extends AbstractRestFunction<NodeDetails> {
+    private String nodeId;
+
+    public GetNodeDetailsFunction(String nodeId) {
+        this.nodeId = nodeId;
+    }
+
+    @Override
+    protected void appendURLPath(StringBuilder buffer) {
+        buffer.append("/nodes/").append(nodeId);
+    }
+}
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/rest/GetNodeSummariesFunction.java b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/rest/GetNodeSummariesFunction.java
new file mode 100644
index 0000000..6af5a01
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/rest/GetNodeSummariesFunction.java
@@ -0,0 +1,17 @@
+package edu.uci.ics.hyracks.adminconsole.client.rest;
+
+import com.google.gwt.core.client.JsArray;
+
+import edu.uci.ics.hyracks.adminconsole.client.beans.NodeSummary;
+
+public class GetNodeSummariesFunction extends AbstractRestFunction<JsArray<NodeSummary>> {
+    public static final GetNodeSummariesFunction INSTANCE = new GetNodeSummariesFunction();
+
+    private GetNodeSummariesFunction() {
+    }
+
+    @Override
+    protected void appendURLPath(StringBuilder buffer) {
+        buffer.append("/nodes");
+    }
+}
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/widgets/JobsTableWidget.java b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/widgets/JobsTableWidget.java
new file mode 100644
index 0000000..4e49bba
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/widgets/JobsTableWidget.java
@@ -0,0 +1,118 @@
+package edu.uci.ics.hyracks.adminconsole.client.widgets;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.uibinder.client.UiBinder;
+import com.google.gwt.uibinder.client.UiField;
+import com.google.gwt.user.cellview.client.CellTable;
+import com.google.gwt.user.cellview.client.TextColumn;
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.Widget;
+import com.google.gwt.view.client.AsyncDataProvider;
+import com.google.gwt.view.client.HasData;
+
+import edu.uci.ics.hyracks.adminconsole.client.beans.JobSummary;
+
+public class JobsTableWidget extends Composite {
+    public interface IRefreshRequestHandler {
+        public void refresh();
+    }
+
+    interface Binder extends UiBinder<Widget, JobsTableWidget> {
+    }
+
+    private final static Binder binder = GWT.create(Binder.class);
+
+    @UiField
+    CellTable<JobSummary> table;
+
+    private AsyncDataProvider<JobSummary> jobSummaryProvider;
+
+    private IRefreshRequestHandler refreshRequestHandler;
+
+    public JobsTableWidget() {
+        initWidget(binder.createAndBindUi(this));
+
+        TextColumn<JobSummary> idCol = new TextColumn<JobSummary>() {
+            @Override
+            public String getValue(JobSummary object) {
+                return object.getJobId();
+            }
+        };
+        idCol.setSortable(true);
+
+        TextColumn<JobSummary> appCol = new TextColumn<JobSummary>() {
+            @Override
+            public String getValue(JobSummary object) {
+                return object.getApplicationName();
+            }
+        };
+        appCol.setSortable(true);
+
+        TextColumn<JobSummary> statusCol = new TextColumn<JobSummary>() {
+            @Override
+            public String getValue(JobSummary object) {
+                return object.getStatus();
+            }
+        };
+        statusCol.setSortable(true);
+
+        /*
+        TextColumn<JobSummary> createTimeCol = new TextColumn<JobSummary>() {
+            @Override
+            public String getValue(JobSummary object) {
+                return renderTime(object.getCreateTime());
+            }
+        };
+        createTimeCol.setSortable(true);
+
+        TextColumn<JobSummary> startTimeCol = new TextColumn<JobSummary>() {
+            @Override
+            public String getValue(JobSummary object) {
+                return renderTime(object.getStartTime());
+            }
+        };
+        startTimeCol.setSortable(true);
+
+        TextColumn<JobSummary> endTimeCol = new TextColumn<JobSummary>() {
+            @Override
+            public String getValue(JobSummary object) {
+                return renderTime(object.getEndTime());
+            }
+        };
+        endTimeCol.setSortable(true);
+        */
+        table.addColumn(idCol, "Job Id");
+        table.addColumn(appCol, "Application Name");
+        table.addColumn(statusCol, "Status");
+        /*
+        table.addColumn(createTimeCol, "Created At");
+        table.addColumn(startTimeCol, "Started At");
+        table.addColumn(endTimeCol, "Finished At");
+        */
+
+        jobSummaryProvider = new AsyncDataProvider<JobSummary>(JobSummary.KEY_PROVIDER) {
+            @Override
+            protected void onRangeChanged(HasData<JobSummary> display) {
+                if (refreshRequestHandler != null) {
+                    refreshRequestHandler.refresh();
+                }
+            }
+        };
+        jobSummaryProvider.addDataDisplay(table);
+    }
+
+    public AsyncDataProvider<JobSummary> getDataProvider() {
+        return jobSummaryProvider;
+    }
+
+    public void setRefreshRequestHandler(IRefreshRequestHandler refreshRequestHandler) {
+        this.refreshRequestHandler = refreshRequestHandler;
+    }
+
+    private static String renderTime(Long time) {
+        if (time < 0) {
+            return "";
+        }
+        return time.toString();
+    }
+}
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/widgets/JobsTableWidget.ui.xml b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/widgets/JobsTableWidget.ui.xml
new file mode 100644
index 0000000..9c48d77
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/widgets/JobsTableWidget.ui.xml
@@ -0,0 +1,9 @@
+<!DOCTYPE ui:UiBinder
+  SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"
+>
+<ui:UiBinder
+  xmlns:ui='urn:ui:com.google.gwt.uibinder'
+  xmlns:g='urn:import:com.google.gwt.user.client.ui'
+  xmlns:c='urn:import:com.google.gwt.user.cellview.client'>
+  <c:CellTable ui:field="table" width="100%"></c:CellTable>
+</ui:UiBinder>
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/widgets/NodesTableWidget.java b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/widgets/NodesTableWidget.java
new file mode 100644
index 0000000..088619c
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/widgets/NodesTableWidget.java
@@ -0,0 +1,102 @@
+package edu.uci.ics.hyracks.adminconsole.client.widgets;
+
+import com.google.gwt.cell.client.ClickableTextCell;
+import com.google.gwt.cell.client.FieldUpdater;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.uibinder.client.UiBinder;
+import com.google.gwt.uibinder.client.UiField;
+import com.google.gwt.user.cellview.client.CellTable;
+import com.google.gwt.user.cellview.client.Column;
+import com.google.gwt.user.cellview.client.TextColumn;
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.Widget;
+import com.google.gwt.view.client.AsyncDataProvider;
+import com.google.gwt.view.client.HasData;
+
+import edu.uci.ics.hyracks.adminconsole.client.beans.NodeSummary;
+
+public class NodesTableWidget extends Composite {
+    public interface IRefreshRequestHandler {
+        public void refresh();
+    }
+
+    public interface IClickListener {
+        public void click(String nodeId);
+    }
+
+    interface Binder extends UiBinder<Widget, NodesTableWidget> {
+    }
+
+    private final static Binder binder = GWT.create(Binder.class);
+
+    @UiField
+    CellTable<NodeSummary> table;
+
+    private AsyncDataProvider<NodeSummary> nodeSummaryProvider;
+
+    private IRefreshRequestHandler refreshRequestHandler;
+
+    private IClickListener cl;
+
+    public NodesTableWidget() {
+        initWidget(binder.createAndBindUi(this));
+
+        Column<NodeSummary, String> idCol = new Column<NodeSummary, String>(new ClickableTextCell()) {
+            @Override
+            public String getValue(NodeSummary object) {
+                return object.getNodeId();
+            }
+        };
+        idCol.setFieldUpdater(new FieldUpdater<NodeSummary, String>() {
+            @Override
+            public void update(int index, NodeSummary object, String value) {
+                if (cl != null) {
+                    cl.click(value);
+                }
+            }
+        });
+        idCol.setSortable(true);
+
+        TextColumn<NodeSummary> heapUsedCol = new TextColumn<NodeSummary>() {
+            @Override
+            public String getValue(NodeSummary object) {
+                return String.valueOf(object.getHeapUsed());
+            }
+        };
+        heapUsedCol.setSortable(true);
+
+        TextColumn<NodeSummary> systemLoadAvgCol = new TextColumn<NodeSummary>() {
+            @Override
+            public String getValue(NodeSummary object) {
+                return String.valueOf(object.getSystemLoadAverage());
+            }
+        };
+        systemLoadAvgCol.setSortable(true);
+
+        table.addColumn(idCol, "Node Id");
+        table.addColumn(heapUsedCol, "Heap Used");
+        table.addColumn(systemLoadAvgCol, "System Load Average");
+
+        nodeSummaryProvider = new AsyncDataProvider<NodeSummary>(NodeSummary.KEY_PROVIDER) {
+            @Override
+            protected void onRangeChanged(HasData<NodeSummary> display) {
+                if (refreshRequestHandler != null) {
+                    refreshRequestHandler.refresh();
+                }
+            }
+        };
+        nodeSummaryProvider.addDataDisplay(table);
+    }
+
+    public void setClickListener(IClickListener cl) {
+        this.cl = cl;
+    }
+
+    public AsyncDataProvider<NodeSummary> getDataProvider() {
+        return nodeSummaryProvider;
+    }
+
+    public void setRefreshRequestHandler(IRefreshRequestHandler refreshRequestHandler) {
+        this.refreshRequestHandler = refreshRequestHandler;
+    }
+}
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/widgets/NodesTableWidget.ui.xml b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/widgets/NodesTableWidget.ui.xml
new file mode 100644
index 0000000..9c48d77
--- /dev/null
+++ b/hyracks-admin-console/src/main/java/edu/uci/ics/hyracks/adminconsole/client/widgets/NodesTableWidget.ui.xml
@@ -0,0 +1,9 @@
+<!DOCTYPE ui:UiBinder
+  SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"
+>
+<ui:UiBinder
+  xmlns:ui='urn:ui:com.google.gwt.uibinder'
+  xmlns:g='urn:import:com.google.gwt.user.client.ui'
+  xmlns:c='urn:import:com.google.gwt.user.cellview.client'>
+  <c:CellTable ui:field="table" width="100%"></c:CellTable>
+</ui:UiBinder>
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/resources/edu/uci/ics/hyracks/adminconsole/HyracksAdminConsole.gwt.xml b/hyracks-admin-console/src/main/resources/edu/uci/ics/hyracks/adminconsole/HyracksAdminConsole.gwt.xml
new file mode 100644
index 0000000..765ad1b
--- /dev/null
+++ b/hyracks-admin-console/src/main/resources/edu/uci/ics/hyracks/adminconsole/HyracksAdminConsole.gwt.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module rename-to='HyracksAdminConsole'>
+  <!-- Inherit the core Web Toolkit stuff.                        -->
+  <inherits name='com.google.gwt.user.User' />
+  <inherits name='com.google.gwt.http.HTTP' />
+  <inherits name='com.googlecode.gchart.GChart' />
+
+  <inherits name='com.google.gwt.user.theme.standard.Standard' />
+  <!-- <inherits name='com.google.gwt.user.theme.chrome.Chrome'/> -->
+  <!-- <inherits name='com.google.gwt.user.theme.dark.Dark'/>     -->
+
+  <!-- Other module inherits                                      -->
+
+  <!-- Specify the app entry point class.                         -->
+  <entry-point class='edu.uci.ics.hyracks.adminconsole.client.HyracksAdminConsole' />
+
+  <!-- Specify the paths for translatable code                    -->
+  <source path='client' />
+
+  <!--set-property name="user.agent" value="safari"></set-property-->
+  <set-configuration-property name="UiBinder.useSafeHtmlTemplates" value="true"/>
+</module>
diff --git a/hyracks-admin-console/src/main/resources/edu/uci/ics/hyracks/adminconsole/client/Messages.properties b/hyracks-admin-console/src/main/resources/edu/uci/ics/hyracks/adminconsole/client/Messages.properties
new file mode 100644
index 0000000..c222555
--- /dev/null
+++ b/hyracks-admin-console/src/main/resources/edu/uci/ics/hyracks/adminconsole/client/Messages.properties
@@ -0,0 +1,2 @@
+sendButton = Send
+nameField = Enter your name
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/webapp/HyracksAdminConsole.css b/hyracks-admin-console/src/main/webapp/HyracksAdminConsole.css
new file mode 100644
index 0000000..7aca7ac
--- /dev/null
+++ b/hyracks-admin-console/src/main/webapp/HyracksAdminConsole.css
@@ -0,0 +1,34 @@
+/** Add css rules here for your application. */
+
+
+/** Example rules used by the template application (remove for your app) */
+h1 {
+  font-size: 2em;
+  font-weight: bold;
+  color: #777777;
+  margin: 40px 0px 70px;
+  text-align: center;
+}
+
+.sendButton {
+  display: block;
+  font-size: 16pt;
+}
+
+/** Most GWT widgets already have a style name defined */
+.gwt-DialogBox {
+  width: 400px;
+}
+
+.dialogVPanel {
+  margin: 5px;
+}
+
+.serverResponseLabelError {
+  color: red;
+}
+
+/** Set ids using widget.getElement().setId("idOfElement") */
+#closeButton {
+  margin: 15px 6px 6px;
+}
diff --git a/hyracks-admin-console/src/main/webapp/HyracksAdminConsole.html b/hyracks-admin-console/src/main/webapp/HyracksAdminConsole.html
new file mode 100644
index 0000000..b909e08
--- /dev/null
+++ b/hyracks-admin-console/src/main/webapp/HyracksAdminConsole.html
@@ -0,0 +1,18 @@
+<!doctype html>
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
+    <link type="text/css" rel="stylesheet" href="HyracksAdminConsole.css">
+    <title>Hyracks Administration Console</title>
+    <script type="text/javascript" language="javascript" src="HyracksAdminConsole/HyracksAdminConsole.nocache.js"></script>
+  </head>
+  <body>
+    <iframe src="javascript:''" id="__gwt_historyFrame" tabIndex='-1' style="position:absolute;width:0;height:0;border:0"></iframe>
+    <noscript>
+      <div style="width: 22em; position: absolute; left: 50%; margin-left: -11em; color: red; background-color: white; border: 1px solid red; padding: 4px; font-family: sans-serif">
+        Your web browser must have JavaScript enabled
+        in order for this application to display correctly.
+      </div>
+    </noscript>
+  </body>
+</html>
\ No newline at end of file
diff --git a/hyracks-admin-console/src/main/webapp/WEB-INF/web.xml b/hyracks-admin-console/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..8c1ab37
--- /dev/null
+++ b/hyracks-admin-console/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE web-app
+    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
+    "http://java.sun.com/dtd/web-app_2_3.dtd">
+
+<web-app>
+
+  <!-- Servlets -->
+  <!--servlet>
+    <servlet-name>greetServlet</servlet-name>
+    <servlet-class>edu.uci.ics.hyracks.adminconsole.server.GreetingServiceImpl</servlet-class>
+  </servlet>
+
+  <servlet-mapping>
+    <servlet-name>greetServlet</servlet-name>
+    <url-pattern>/HyracksAdminConsole/greet</url-pattern>
+  </servlet-mapping-->
+
+  <!-- Default page to serve -->
+  <welcome-file-list>
+    <welcome-file>HyracksAdminConsole.html</welcome-file>
+  </welcome-file-list>
+
+</web-app>
