diff --git a/gui/html/chronoshare.js b/gui/html/chronoshare.js
index 3ceb828..c8b8ae0 100644
--- a/gui/html/chronoshare.js
+++ b/gui/html/chronoshare.js
@@ -1,65 +1,161 @@
 
-  hostip = "127.0.0.1";
-        
-  var AsyncGetClosure = function AsyncGetClosure() {
-                      Closure.call(this);
-              };
+$.Class ("FilesClosure", {}, {
+    upcall: function(kind, upcallInfo) {
+        $("#loader").fadeOut (500); // ("hidden");
+        if (kind == Closure.UPCALL_CONTENT) {
+            convertedData = DataUtils.toString (upcallInfo.contentObject.content);
+            $("#json").text (convertedData);
+            $("#json").removeClass ("hidden");
+            data = JSON.parse (convertedData);
 
-              AsyncGetClosure.prototype.upcall = function(kind, upcallInfo, tmp) {
-                      if (kind == Closure.UPCALL_FINAL) {
-                              // Do nothing.
-                      } else if (kind == Closure.UPCALL_CONTENT) {
-                              var content = upcallInfo.contentObject;
-      var nameStr = content.name.getName().split("/").slice(5,6);
-      
-      if (nameStr == "prefix") {
-        document.getElementById('prefixcontent').innerHTML = DataUtils.toString(content.content);
-        prefix();
-      } else if (nameStr == "link") {
-        document.getElementById('linkcontent').innerHTML = DataUtils.toString(content.content);
-        link();
-      } else {
-        var data = DataUtils.toString(content.content);
-        var obj = jQuery.parseJSON(data);
-        document.getElementById("lastupdated").innerHTML = obj.lastupdated;
-        document.getElementById("lastlog").innerHTML = obj.lastlog;
-        document.getElementById("lasttimestamp").innerHTML = obj.lasttimestamp;
-      }
-                      } else if (kind == Closure.UPCALL_INTEREST_TIMED_OUT) {
-                              console.log("Closure.upcall called with interest time out.");
-                      }
-                      return Closure.RESULT_OK;
-              };
+            // error handling?
+            // if (data.files instanceof Array) {
+            //     alert (data.files);
+            // }
 
-              function getStatus(name) {
-    // Template interest to get the latest content.
-    var interest = new Interest("/tmp/");
-                      interest.childSelector = 1;
-                      interest.interestLifetime = 4000;
-
-                      ndn.expressInterest(new Name("/ndn/memphis.edu/netlab/status/" + name), new AsyncGetClosure(), interest);
-  }
-
-  // Calls to get the content data.
-  function begin() {
-    getStatus("metadata");
-    getStatus("prefix");
-    getStatus("link");
-  }
-
-  var ndn;
-  $(document).ready(function() {
-    $("#all").fadeIn(500);
-    var res = detect();
-
-    if (!res) {
-      $("#base").fadeOut(50);
-      $("#nosupport").fadeIn(500);
+            var html = $("tbody#files");
+            for (var i = 0; i < data.files.length; i++) {
+                file = data.files[i];
+                html = html.append ([
+                    "<tr"+(i%2?" class=\"odd\"":"")+">",
+                    "<td class=\"border-left\">" + file.filename + "</td>",
+                    "<td>" + file.version + "</td>",
+                    "<td>" + file.timestamp + "</td>",
+                    "<td class=\"border-right\">" + "</td>",
+                    "</tr>"
+                ].join());
+            }
+        }
+        else if (kind == Closure.UPCALL_INTEREST_TIMED_OUT) {
+            $("#error").html ("Interest timed out");
+            $("#error").removeClass ("hidden");
+        }
+        else {
+            $("#error").html ("Unknown error happened");
+            $("#error").removeClass ("hidden");
+            // some kind of error
+        }
     }
-    else {
-      openHandle = function() { console.log("NDN established"); };
-      ndn = new NDN({host:hostip, onopen:openHandle});
-      ndn.transport.connectWebSocket(ndn);
-    }
-  });
+});
 
+
+$.Class ("ChronoShare", { },
+ {
+     init: function (username, foldername) {
+         this.username = new Name (username);
+         this.files = new Name ("/localhost").add (this.username).add ("chronoshare").add (foldername).add ("info").add ("files").add ("folder");
+
+         this.actions = new Name ("/localhost").add (this.username).add ("chronoshare").add (foldername).add ("info").add ("actions").add ("folder");
+
+         this.restore = new Name ("/localhost").add (this.username).add ("chronoshare").add (foldername).add ("cmd").add ("restore").add ("file");
+
+         this.ndn = new NDN ({host:"127.0.0.1", getHostAndPort: function() { return {host: "127.0.0.1", port: 9696}}});
+         // this.ndn.transport.connect (this.ndn);
+     },
+
+     run: function () {
+         request = new Name ().add (this.files)./*add (folder_in_question).*/add ("nonce").addSegment (0);
+         console.log (request.to_uri ());
+         $("#files").empty ();
+         // $("#loader").removeClass ("hidden");
+         $("#loader").fadeIn (500);
+         this.ndn.expressInterest (request, new FilesClosure ());
+     }
+// ,
+
+     // sendRequest: function () {
+     //     alert ('bla');
+     // }
+ });
+
+
+// $.Class ("onFiles",
+//  {
+//  },
+
+//  {
+//      upcall: function(kind, upcallInfo, tmp) {
+//          if (kind
+//      }
+//  });
+
+// var AsyncGetClosure = function AsyncGetClosure() {
+//     Closure.call(this);
+// };
+
+// AsyncGetClosure.prototype.upcall = function(kind, upcallInfo, tmp) {
+//     if (kind == Closure.UPCALL_FINAL) {
+//         // Do nothing.
+//     } else if (kind == Closure.UPCALL_CONTENT) {
+//         var content = upcallInfo.contentObject;
+// 	var nameStr = content.name.getName().split("/").slice(5,6);
+
+// 	if (nameStr == "prefix") {
+// 	    document.getElementById('prefixcontent').innerHTML = DataUtils.toString(content.content);
+// 	    prefix();
+// 	} else if (nameStr == "link") {
+// 	    document.getElementById('linkcontent').innerHTML = DataUtils.toString(content.content);
+// 	    link();
+// 	} else {
+// 	    var data = DataUtils.toString(content.content);
+// 	    var obj = jQuery.parseJSON(data);
+// 	    document.getElementById("lastupdated").innerHTML = obj.lastupdated;
+// 	    document.getElementById("lastlog").innerHTML = obj.lastlog;
+// 	    document.getElementById("lasttimestamp").innerHTML = obj.lasttimestamp;
+// 	}
+//     } else if (kind == Closure.UPCALL_INTEREST_TIMED_OUT) {
+//         console.log("Closure.upcall called with interest time out.");
+//     }
+//     return Closure.RESULT_OK;
+// };
+
+// function getStatus(name) {
+//     // Template interest to get the latest content.
+//     var interest = new Interest("/tmp/");
+//     interest.childSelector = 1;
+//     interest.interestLifetime = 4000;
+
+//     ndn.expressInterest(new Name("/ndn/memphis.edu/netlab/status/" + name), new AsyncGetClosure(), interest);
+// }
+
+// // Calls to get the content data.
+// function begin() {
+//     getStatus("metadata");
+//     getStatus("prefix");
+//     getStatus("link");
+// }
+
+// var ndn;
+// $(document).ready(function() {
+//     $("#all").fadeIn(500);
+//     var res = detect();
+
+//     if (!res) {
+// 	$("#base").fadeOut(50);
+// 	$("#nosupport").fadeIn(500);
+//     } else {
+//         //$("#all").fadeIn(500);
+
+//         $.get("test.php", function() {
+// 	    openHandle = function() { begin() };
+//             ndn = new NDN({host:hostip, onopen:openHandle});
+//             ndn.transport.connectWebSocket(ndn);
+// 	    $("#base").fadeOut(500, function () {
+//                 $("#status").fadeIn(1000);
+//             });
+//         });
+//     }
+// });
+
+// $("#continue").click(function() {
+//     $("#nosupport").fadeOut(50);
+//     $("#base").fadeIn(500);
+//     $.get("test.php", function() {
+//         openHandle = function() { begin() };
+//         ndn = new NDN({host:hostip, onopen:openHandle});
+//         ndn.transport.connectWebSocket(ndn);
+//         $("#base").fadeOut(500, function () {
+//             $("#status").fadeIn(1000);
+//         });
+//     });
+// });
