diff --git a/gui/chronosharegui.cpp b/gui/chronosharegui.cpp
index d9c4409..781127e 100644
--- a/gui/chronosharegui.cpp
+++ b/gui/chronosharegui.cpp
@@ -21,12 +21,12 @@
 #include "chronosharegui.hpp"
 #include "core/chronoshare-config.hpp"
 
-#include "logging.hpp"
 #include "ccnx-wrapper.hpp"
-#include <QValidator>
+#include "logging.hpp"
+#include <QDesktopServices>
 #include <QDir>
 #include <QFileInfo>
-#include <QDesktopServices>
+#include <QValidator>
 
 #include <boost/make_shared.hpp>
 
@@ -43,35 +43,36 @@
 static const QString ICON_BIG_FILE(":/images/chronoshare-big.png");
 static const QString ICON_TRAY_FILE(":/images/" TRAY_ICON);
 
-INIT_LOGGER ("Gui");
+INIT_LOGGER("Gui");
 
-ChronoShareGui::ChronoShareGui(QWidget *parent)
+ChronoShareGui::ChronoShareGui(QWidget* parent)
   : QDialog(parent)
   , m_watcher(0)
   , m_dispatcher(0)
   , m_httpServer(0)
 #ifdef ADHOC_SUPPORTED
-  , m_executor (1)
+  , m_executor(1)
 #endif
 #ifdef SPARKLE_SUPPORTED
-  , m_autoUpdate(new SparkleAutoUpdate(tr("http://irl.cs.ucla.edu/~zhenkai/chronoshare_dist/chronoshare.xml")))
+  , m_autoUpdate(
+      new SparkleAutoUpdate(tr("http://irl.cs.ucla.edu/~zhenkai/chronoshare_dist/chronoshare.xml")))
 #endif
 {
   setWindowTitle("Settings");
-  setMinimumWidth (600);
+  setMinimumWidth(600);
 
   labelUsername = new QLabel("Username (hint: /<username>)");
   labelSharedFolder = new QLabel("Shared Folder Name");
   labelSharedFolderPath = new QLabel("Shared Folder Path");
 
   QRegExp regex("(/[^/]+)+$");
-  QValidator *prefixValidator = new QRegExpValidator(regex, this);
+  QValidator* prefixValidator = new QRegExpValidator(regex, this);
 
   editUsername = new QLineEdit();
   editUsername->setValidator(prefixValidator);
 
   QRegExp noPureWhiteSpace("^\\S+.*$");
-  QValidator *wsValidator = new QRegExpValidator(noPureWhiteSpace, this);
+  QValidator* wsValidator = new QRegExpValidator(noPureWhiteSpace, this);
   editSharedFolder = new QLineEdit();
   editSharedFolder->setValidator(wsValidator);
 
@@ -111,109 +112,100 @@
   m_trayIcon->show();
 
   // load settings
-  if(!loadSettings())
-    {
-      // prompt user to choose folder
-      openMessageBox("First Time Setup", "Please enter a username, shared folder name and choose the shared folder path on your local filesystem.");
-      viewSettings();
-      openFileDialog();
+  if (!loadSettings()) {
+    // prompt user to choose folder
+    openMessageBox("First Time Setup",
+                   "Please enter a username, shared folder name and choose the shared folder path on your local filesystem.");
+    viewSettings();
+    openFileDialog();
+    viewSettings();
+  }
+  else {
+    if (m_username.isNull() || m_username == "" || m_sharedFolderName.isNull() ||
+        m_sharedFolderName == "") {
+      openMessageBox("First Time Setup",
+                     "To activate ChronoShare, please configure your username and shared folder name.");
       viewSettings();
     }
-  else
-    {
-      if (m_username.isNull () || m_username == "" ||
-          m_sharedFolderName.isNull () || m_sharedFolderName == "")
-        {
-          openMessageBox("First Time Setup", "To activate ChronoShare, please configure your username and shared folder name.");
-          viewSettings();
-        }
-      else
-        {
-          startBackend();
-        }
+    else {
+      startBackend();
     }
+  }
 
 #ifdef ADHOC_SUPPORTED
-  m_executor.start ();
+  m_executor.start();
 #endif
 }
 
 void
-ChronoShareGui::startBackend (bool restart/*=false*/)
+ChronoShareGui::startBackend(bool restart /*=false*/)
 {
-  if (m_username.isNull () || m_username=="" ||
-      m_sharedFolderName.isNull () || m_sharedFolderName=="" ||
-      m_dirPath.isNull () || m_dirPath=="")
-    {
-      _LOG_DEBUG ("Don't start backend, because settings are in progress or incomplete");
+  if (m_username.isNull() || m_username == "" || m_sharedFolderName.isNull() ||
+      m_sharedFolderName == "" || m_dirPath.isNull() || m_dirPath == "") {
+    _LOG_DEBUG("Don't start backend, because settings are in progress or incomplete");
+    return;
+  }
+
+  if (m_watcher != 0 && m_dispatcher != 0) {
+    if (!restart) {
       return;
     }
 
-  if (m_watcher != 0 && m_dispatcher != 0)
-  {
-    if (!restart)
-      {
-        return;
-      }
-
-    _LOG_DEBUG ("Restarting Dispatcher and FileWatcher for the new location or new username");
+    _LOG_DEBUG("Restarting Dispatcher and FileWatcher for the new location or new username");
     delete m_watcher; // stop filewatching ASAP
     delete m_dispatcher; // stop dispatcher ASAP, but after watcher (to prevent triggering callbacks on deleted object)
   }
 
-  filesystem::path realPathToFolder (m_dirPath.toStdString ());
-  realPathToFolder /= m_sharedFolderName.toStdString ();
+  filesystem::path realPathToFolder(m_dirPath.toStdString());
+  realPathToFolder /= m_sharedFolderName.toStdString();
 
-  m_dispatcher = new Dispatcher (m_username.toStdString (), m_sharedFolderName.toStdString (),
-                                 realPathToFolder, make_shared<NdnxWrapper> ());
+  m_dispatcher = new Dispatcher(m_username.toStdString(), m_sharedFolderName.toStdString(),
+                                realPathToFolder, make_shared<CcnxWrapper>());
 
   // Alex: this **must** be here, otherwise m_dirPath will be uninitialized
-  m_watcher = new FsWatcher (realPathToFolder.string ().c_str (),
-                             bind (&Dispatcher::Did_LocalFile_AddOrModify, m_dispatcher, _1),
-                             bind (&Dispatcher::Did_LocalFile_Delete,      m_dispatcher, _1));
+  m_watcher = new FsWatcher(realPathToFolder.string().c_str(),
+                            bind(&Dispatcher::Did_LocalFile_AddOrModify, m_dispatcher, _1),
+                            bind(&Dispatcher::Did_LocalFile_Delete, m_dispatcher, _1));
 
-  if (m_httpServer != 0)
-    {
-      // no need to restart webserver if it already exists
-      return;
-    }
+  if (m_httpServer != 0) {
+    // no need to restart webserver if it already exists
+    return;
+  }
 
   QFileInfo indexHtmlInfo(":/html/index.html");
-  if (indexHtmlInfo.exists())
-  {
-    try
-    {
+  if (indexHtmlInfo.exists()) {
+    try {
       m_httpServer = new http::server::server(HTTP_SERVER_ADDRESS, HTTP_SERVER_PORT, DOC_ROOT);
       m_httpServerThread = boost::thread(&http::server::server::run, m_httpServer);
     }
-    catch (std::exception &e)
-    {
-      _LOG_ERROR ("Start http server failed");
+    catch (std::exception& e) {
+      _LOG_ERROR("Start http server failed");
       m_httpServer = 0; // just to make sure
       QMessageBox msgBox;
-      msgBox.setText ("WARNING: Cannot start http server!");
-      msgBox.setIcon (QMessageBox::Warning);
-      msgBox.setInformativeText(QString("Starting http server failed. You will not be able to check history from web brower. Exception caused: %1").arg(e.what()));
+      msgBox.setText("WARNING: Cannot start http server!");
+      msgBox.setIcon(QMessageBox::Warning);
+      msgBox.setInformativeText(
+        QString(
+          "Starting http server failed. You will not be able to check history from web brower. Exception caused: %1")
+          .arg(e.what()));
       msgBox.setStandardButtons(QMessageBox::Ok);
       msgBox.exec();
     }
   }
-  else
-  {
-    _LOG_ERROR ("Http server doc root dir does not exist!");
+  else {
+    _LOG_ERROR("Http server doc root dir does not exist!");
   }
 }
 
 ChronoShareGui::~ChronoShareGui()
 {
 #ifdef ADHOC_SUPPORTED
-  m_executor.shutdown ();
+  m_executor.shutdown();
 #endif
 
   delete m_watcher; // stop filewatching ASAP
   delete m_dispatcher; // stop dispatcher ASAP, but after watcher (to prevent triggering callbacks on deleted object)
-  if (m_httpServer != 0)
-  {
+  if (m_httpServer != 0) {
     m_httpServer->handle_stop();
     m_httpServerThread.join();
     delete m_httpServer;
@@ -243,7 +235,8 @@
   delete mainLayout;
 }
 
-void ChronoShareGui::openMessageBox(QString title, QString text)
+void
+ChronoShareGui::openMessageBox(QString title, QString text)
 {
   QMessageBox messageBox(this);
   messageBox.setWindowTitle(title);
@@ -254,7 +247,8 @@
   messageBox.exec();
 }
 
-void ChronoShareGui::openMessageBox(QString title, QString text, QString infotext)
+void
+ChronoShareGui::openMessageBox(QString title, QString text, QString infotext)
 {
   QMessageBox messageBox(this);
   messageBox.setWindowTitle(title);
@@ -266,9 +260,10 @@
   messageBox.exec();
 }
 
-void ChronoShareGui::createActionsAndMenu()
+void
+ChronoShareGui::createActionsAndMenu()
 {
-  _LOG_DEBUG ("Create actions");
+  _LOG_DEBUG("Create actions");
 
   // create the "open folder" action
   m_openFolder = new QAction(tr("&Open Folder"), this);
@@ -278,8 +273,7 @@
   connect(m_openWeb, SIGNAL(triggered()), this, SLOT(openInWebBrowser()));
 
   m_recentFilesMenu = new QMenu(tr("Recently Changed Files"), this);
-  for (int i = 0; i < 5; i++)
-  {
+  for (int i = 0; i < 5; i++) {
     m_fileActions[i] = new QAction(this);
     m_fileActions[i]->setVisible(false);
     connect(m_fileActions[i], SIGNAL(triggered()), this, SLOT(openFile()));
@@ -297,15 +291,15 @@
 
 #ifdef ADHOC_SUPPORTED
   // create "AdHoc Wifi" action
-  m_wifiAction = new QAction (tr("Enable AdHoc &WiFI"), m_trayIconMenu);
-  m_wifiAction->setChecked (false);
-  m_wifiAction->setCheckable (true);
-  connect (m_wifiAction, SIGNAL (toggled(bool)), this, SLOT(onAdHocChange(bool)));
+  m_wifiAction = new QAction(tr("Enable AdHoc &WiFI"), m_trayIconMenu);
+  m_wifiAction->setChecked(false);
+  m_wifiAction->setCheckable(true);
+  connect(m_wifiAction, SIGNAL(toggled(bool)), this, SLOT(onAdHocChange(bool)));
 #endif
 
 #ifdef SPARKLE_SUPPORTED
-  m_checkForUpdates = new QAction (tr("Check For Updates"), this);
-  connect (m_checkForUpdates, SIGNAL(triggered()), this, SLOT(onCheckForUpdates()));
+  m_checkForUpdates = new QAction(tr("Check For Updates"), this);
+  connect(m_checkForUpdates, SIGNAL(triggered()), this, SLOT(onCheckForUpdates()));
 #endif
 
   // create the "quit program" action
@@ -313,7 +307,8 @@
   connect(m_quitProgram, SIGNAL(triggered()), qApp, SLOT(quit()));
 }
 
-void ChronoShareGui::createTrayIcon()
+void
+ChronoShareGui::createTrayIcon()
 {
   // create a new icon menu
   m_trayIconMenu = new QMenu(this);
@@ -346,45 +341,42 @@
   m_trayIcon->setContextMenu(m_trayIconMenu);
 
   // handle left click of icon
-  connect(m_trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(trayIconClicked(QSystemTrayIcon::ActivationReason)));
+  connect(m_trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this,
+          SLOT(trayIconClicked(QSystemTrayIcon::ActivationReason)));
 }
 
 void
-ChronoShareGui::onAdHocChange (bool state)
+ChronoShareGui::onAdHocChange(bool state)
 {
 #ifdef ADHOC_SUPPORTED
-  if (m_wifiAction->isChecked ())
-    {
-      QMessageBox msgBox;
-      msgBox.setText ("WARNING: your WiFi will be disconnected");
-      msgBox.setIcon (QMessageBox::Warning);
-      msgBox.setInformativeText("AdHoc WiFi will disconnect your current WiFi.\n  Are you sure that you are OK with that?");
-      msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
-      msgBox.setDefaultButton(QMessageBox::Cancel);
-      int ret = msgBox.exec();
+  if (m_wifiAction->isChecked()) {
+    QMessageBox msgBox;
+    msgBox.setText("WARNING: your WiFi will be disconnected");
+    msgBox.setIcon(QMessageBox::Warning);
+    msgBox.setInformativeText(
+      "AdHoc WiFi will disconnect your current WiFi.\n  Are you sure that you are OK with that?");
+    msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
+    msgBox.setDefaultButton(QMessageBox::Cancel);
+    int ret = msgBox.exec();
 
-      if (ret == QMessageBox::Cancel)
-        {
-          m_wifiAction->setChecked (false);
-        }
-      else
-        {
-
-          m_wifiAction->setText (tr("Disable AdHoc WiFI"));
-
-          // create adhoc
-          m_executor.execute (Adhoc::CreateAdhoc);
-        }
+    if (ret == QMessageBox::Cancel) {
+      m_wifiAction->setChecked(false);
     }
-  else
-    {
-      m_wifiAction->setText (tr("Enable AdHoc WiFI"));
+    else {
+      m_wifiAction->setText(tr("Disable AdHoc WiFI"));
 
-      // disable adhoc
-      m_executor.execute (Adhoc::DestroyAdhoc);
-
-      // a trick in DestroyAdhoc ensures that WiFi will be reconnected to a default WiFi
+      // create adhoc
+      m_executor.execute(Adhoc::CreateAdhoc);
     }
+  }
+  else {
+    m_wifiAction->setText(tr("Enable AdHoc WiFI"));
+
+    // disable adhoc
+    m_executor.execute(Adhoc::DestroyAdhoc);
+
+    // a trick in DestroyAdhoc ensures that WiFi will be reconnected to a default WiFi
+  }
 #endif
 }
 
@@ -398,38 +390,43 @@
 #endif
 }
 
-void ChronoShareGui::setIcon()
+void
+ChronoShareGui::setIcon()
 {
   // set the icon image
   m_trayIcon->setIcon(QIcon(ICON_TRAY_FILE));
 }
 
-void ChronoShareGui::openSharedFolder()
+void
+ChronoShareGui::openSharedFolder()
 {
-  filesystem::path realPathToFolder (m_dirPath.toStdString ());
-  realPathToFolder /= m_sharedFolderName.toStdString ();
+  filesystem::path realPathToFolder(m_dirPath.toStdString());
+  realPathToFolder /= m_sharedFolderName.toStdString();
   QString path = QDir::toNativeSeparators(realPathToFolder.string().c_str());
   QDesktopServices::openUrl(QUrl("file:///" + path));
 }
 
-void ChronoShareGui::openInWebBrowser()
+void
+ChronoShareGui::openInWebBrowser()
 {
-  QUrl url ("http://localhost:9001/");
-  url.setFragment ("folderHistory&"
-                   "user=" + QUrl::toPercentEncoding (m_username) + "&"
-                   "folder=" + QUrl::toPercentEncoding (m_sharedFolderName));
+  QUrl url("http://localhost:9001/");
+  url.setFragment("folderHistory&"
+                  "user=" +
+                  QUrl::toPercentEncoding(m_username) + "&"
+                                                        "folder=" +
+                  QUrl::toPercentEncoding(m_sharedFolderName));
 
   // i give up. there is double encoding and I have no idea how to fight it...
-  QDesktopServices::openUrl (url);
+  QDesktopServices::openUrl(url);
 }
 
-void ChronoShareGui::openFile()
+void
+ChronoShareGui::openFile()
 {
   // figure out who sent the signal
-  QAction *pAction = qobject_cast<QAction*>(sender());
-  if (pAction->isEnabled())
-  {
-    // we stored full path of the file in this toolTip field
+  QAction* pAction = qobject_cast<QAction*>(sender());
+  if (pAction->isEnabled()) {
+// we stored full path of the file in this toolTip field
 #ifdef Q_WS_MAC
     // we do some hack so we could show the file in Finder highlighted
     QStringList args;
@@ -449,30 +446,31 @@
   }
 }
 
-void ChronoShareGui::updateRecentFilesMenu()
+void
+ChronoShareGui::updateRecentFilesMenu()
 {
-  for (int i = 0; i < 5; i++)
-  {
+  for (int i = 0; i < 5; i++) {
     m_fileActions[i]->setVisible(false);
   }
-  m_dispatcher->LookupRecentFileActions(boost::bind(&ChronoShareGui::checkFileAction, this, _1, _2, _3), 5);
+  m_dispatcher->LookupRecentFileActions(boost::bind(&ChronoShareGui::checkFileAction, this, _1, _2,
+                                                    _3),
+                                        5);
 }
 
-void ChronoShareGui::checkFileAction (const std::string &filename, int action, int index)
+void
+ChronoShareGui::checkFileAction(const std::string& filename, int action, int index)
 {
-  filesystem::path realPathToFolder (m_dirPath.toStdString ());
-  realPathToFolder /= m_sharedFolderName.toStdString ();
+  filesystem::path realPathToFolder(m_dirPath.toStdString());
+  realPathToFolder /= m_sharedFolderName.toStdString();
   realPathToFolder /= filename;
-  QString fullPath =  realPathToFolder.string().c_str();
+  QString fullPath = realPathToFolder.string().c_str();
   QFileInfo fileInfo(fullPath);
-  if (fileInfo.exists())
-  {
+  if (fileInfo.exists()) {
     // This is a hack, we just use some field to store the path
     m_fileActions[index]->setToolTip(fileInfo.absolutePath());
     m_fileActions[index]->setEnabled(true);
   }
-  else
-  {
+  else {
     // after half an hour frustrating test and search around,
     // I think it's the problem of Qt.
     // According to the Qt doc, the action cannot be clicked
@@ -483,8 +481,7 @@
     // Give up at least for now
     m_fileActions[index]->setEnabled(false);
     // UPDATE, file not fetched yet
-    if (action == 0)
-    {
+    if (action == 0) {
       QFont font;
       // supposed by change the font, didn't happen
       font.setWeight(QFont::Light);
@@ -492,8 +489,7 @@
       m_fileActions[index]->setToolTip(tr("Fetching..."));
     }
     // DELETE
-    else
-    {
+    else {
       QFont font;
       // supposed by change the font, didn't happen
       font.setStrikeOut(true);
@@ -505,100 +501,95 @@
   m_fileActions[index]->setVisible(true);
 }
 
-void ChronoShareGui::changeSettings()
+void
+ChronoShareGui::changeSettings()
 {
   QString oldUsername = m_username;
   QString oldSharedFolderName = m_sharedFolderName;
 
-  if(!editUsername->text().isEmpty())
+  if (!editUsername->text().isEmpty())
     m_username = editUsername->text().trimmed();
   else
     editUsername->setText(m_username);
 
-  if(!editSharedFolder->text().isEmpty())
+  if (!editSharedFolder->text().isEmpty())
     m_sharedFolderName = editSharedFolder->text().trimmed();
   else
     editSharedFolder->setText(m_sharedFolderName);
 
-  if (m_username.isNull () || m_username=="" ||
-      m_sharedFolderName.isNull () || m_sharedFolderName=="")
-    {
-      openMessageBox ("Error",
-                      "Username and shared folder name cannot be empty");
-    }
-  else
-    {
-      saveSettings();
-      this->hide();
+  if (m_username.isNull() || m_username == "" || m_sharedFolderName.isNull() ||
+      m_sharedFolderName == "") {
+    openMessageBox("Error", "Username and shared folder name cannot be empty");
+  }
+  else {
+    saveSettings();
+    this->hide();
 
-      if (m_username != oldUsername ||
-          oldSharedFolderName != m_sharedFolderName)
-        {
-          startBackend (true); // restart dispatcher/fswatcher
-        }
+    if (m_username != oldUsername || oldSharedFolderName != m_sharedFolderName) {
+      startBackend(true); // restart dispatcher/fswatcher
     }
+  }
 }
 
-void ChronoShareGui::openFileDialog()
+void
+ChronoShareGui::openFileDialog()
 {
-  while (true)
-    {
-      // prompt user for new directory
-      QString tempPath = QFileDialog::getExistingDirectory(this, tr("Choose ChronoShare folder"),
-                                                           m_dirPath, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
-      if (tempPath.isNull ())
-        {
-          if (m_dirPath.isNull ())
-            {
-              openMessageBox ("Notice", "ChronoShare will use [" + QDir::homePath () + "/ChronoShare]. \n\nYou can change it later selecting \"Change Folder\" menu.");
+  while (true) {
+    // prompt user for new directory
+    QString tempPath =
+      QFileDialog::getExistingDirectory(this, tr("Choose ChronoShare folder"), m_dirPath,
+                                        QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
+    if (tempPath.isNull()) {
+      if (m_dirPath.isNull()) {
+        openMessageBox("Notice",
+                       "ChronoShare will use [" + QDir::homePath() +
+                         "/ChronoShare]. \n\nYou can change it later selecting \"Change Folder\" menu.");
 
-              m_dirPath = QDir::homePath () + "/ChronoShare";
-              editSharedFolderPath->setText (m_dirPath);
-              break;
-            }
-          else
-            {
-              // user just cancelled, no need to do anything else
-              return;
-            }
-        }
-
-      QFileInfo qFileInfo (tempPath);
-
-      if (!qFileInfo.isDir())
-        {
-          openMessageBox ("Error", "Please select an existing folder or create a new one.");
-          continue;
-        }
-
-      if (m_dirPath == tempPath)
-        {
-          // user selected the same directory, no need to do anything
-          return;
-        }
-
-      m_dirPath = tempPath;
-      editSharedFolderPath->setText(m_dirPath);
-      break;
+        m_dirPath = QDir::homePath() + "/ChronoShare";
+        editSharedFolderPath->setText(m_dirPath);
+        break;
+      }
+      else {
+        // user just cancelled, no need to do anything else
+        return;
+      }
     }
 
-  _LOG_DEBUG ("Selected path: " << m_dirPath.toStdString ());
-  // save settings
-  saveSettings ();
+    QFileInfo qFileInfo(tempPath);
 
-  startBackend (true); // restart dispatcher/fswatcher
+    if (!qFileInfo.isDir()) {
+      openMessageBox("Error", "Please select an existing folder or create a new one.");
+      continue;
+    }
+
+    if (m_dirPath == tempPath) {
+      // user selected the same directory, no need to do anything
+      return;
+    }
+
+    m_dirPath = tempPath;
+    editSharedFolderPath->setText(m_dirPath);
+    break;
+  }
+
+  _LOG_DEBUG("Selected path: " << m_dirPath.toStdString());
+  // save settings
+  saveSettings();
+
+  startBackend(true); // restart dispatcher/fswatcher
 }
 
-void ChronoShareGui::trayIconClicked (QSystemTrayIcon::ActivationReason reason)
+void
+ChronoShareGui::trayIconClicked(QSystemTrayIcon::ActivationReason reason)
 {
   // if double clicked, open shared folder
-  if(reason == QSystemTrayIcon::DoubleClick)
-    {
-      openSharedFolder();
-    }
+  if (reason == QSystemTrayIcon::DoubleClick) {
+    openSharedFolder();
+  }
 }
 
-void ChronoShareGui::viewSettings()
+void
+ChronoShareGui::viewSettings()
 {
   //simple for now
   this->show();
@@ -606,80 +597,77 @@
   this->activateWindow();
 }
 
-bool ChronoShareGui::loadSettings()
+bool
+ChronoShareGui::loadSettings()
 {
   bool successful = true;
 
   // Load Settings
   // QSettings settings(m_settingsFilePath, QSettings::NativeFormat);
-  QSettings settings (QSettings::NativeFormat, QSettings::UserScope, "irl.cs.ucla.edu", "ChronoShare");
+  QSettings settings(QSettings::NativeFormat, QSettings::UserScope, "irl.cs.ucla.edu", "ChronoShare");
 
   // _LOG_DEBUG (lexical_cast<string> (settings.allKeys()));
 
-  if(settings.contains("username"))
-    {
-      m_username = settings.value("username", "admin").toString();
-    }
-  else
-    {
-      successful = false;
-    }
+  if (settings.contains("username")) {
+    m_username = settings.value("username", "admin").toString();
+  }
+  else {
+    successful = false;
+  }
 
   editUsername->setText(m_username);
 
-  if(settings.contains("sharedfoldername"))
-    {
-      m_sharedFolderName = settings.value("sharedfoldername", "shared").toString();
-    }
-  else
-    {
-      successful = false;
-    }
+  if (settings.contains("sharedfoldername")) {
+    m_sharedFolderName = settings.value("sharedfoldername", "shared").toString();
+  }
+  else {
+    successful = false;
+  }
 
   editSharedFolder->setText(m_sharedFolderName);
 
-  if(settings.contains("dirPath"))
-    {
-      m_dirPath = settings.value("dirPath", QDir::homePath()).toString();
-    }
-  else
-    {
-      successful = false;
-    }
+  if (settings.contains("dirPath")) {
+    m_dirPath = settings.value("dirPath", QDir::homePath()).toString();
+  }
+  else {
+    successful = false;
+  }
 
   editSharedFolderPath->setText(m_dirPath);
 
-  _LOG_DEBUG ("Found configured path: " << (successful ? m_dirPath.toStdString () : std::string("no")));
+  _LOG_DEBUG("Found configured path: " << (successful ? m_dirPath.toStdString() : std::string("no")));
 
   return successful;
 }
 
-void ChronoShareGui::saveSettings()
+void
+ChronoShareGui::saveSettings()
 {
   // Save Settings
   // QSettings settings(m_settingsFilePath, QSettings::NativeFormat);
-  QSettings settings (QSettings::NativeFormat, QSettings::UserScope, "irl.cs.ucla.edu", "ChronoShare");
+  QSettings settings(QSettings::NativeFormat, QSettings::UserScope, "irl.cs.ucla.edu", "ChronoShare");
 
   settings.setValue("dirPath", m_dirPath);
   settings.setValue("username", m_username);
   settings.setValue("sharedfoldername", m_sharedFolderName);
 }
 
-void ChronoShareGui::closeEvent(QCloseEvent* event)
+void
+ChronoShareGui::closeEvent(QCloseEvent* event)
 {
-  _LOG_DEBUG ("Close Event");
+  _LOG_DEBUG("Close Event");
 
-  if (m_username.isNull () || m_username == "" ||
-      m_sharedFolderName.isNull () || m_sharedFolderName == "")
-    {
-      openMessageBox ("ChronoShare is not active", "Username and/or shared folder name are not set.\n\n To activate ChronoShare, open Settings menu and configure your username and shared folder name");
-    }
+  if (m_username.isNull() || m_username == "" || m_sharedFolderName.isNull() ||
+      m_sharedFolderName == "") {
+    openMessageBox("ChronoShare is not active",
+                   "Username and/or shared folder name are not set.\n\n To activate ChronoShare, open Settings menu and configure your username and shared folder name");
+  }
 
   this->hide();
   event->ignore(); // don't let the event propagate to the base class
 }
 
 #if WAF
-#include "chronosharegui.moc"
 #include "chronosharegui.cpp.moc"
+#include "chronosharegui.moc"
 #endif
diff --git a/gui/chronosharegui.hpp b/gui/chronosharegui.hpp
index 9721b39..755c633 100644
--- a/gui/chronosharegui.hpp
+++ b/gui/chronosharegui.hpp
@@ -28,21 +28,21 @@
 #include "sparkle-auto-update.hpp"
 #endif
 
-#include <QtGui>
-#include <QWidget>
-#include <QSystemTrayIcon>
-#include <QMenu>
+#include <QApplication>
+#include <QCloseEvent>
 #include <QDebug>
-#include <QProcess>
-#include <QSettings>
 #include <QDir>
 #include <QFileDialog>
-#include <QCloseEvent>
+#include <QMenu>
 #include <QMessageBox>
-#include <QApplication>
+#include <QProcess>
+#include <QSettings>
+#include <QSystemTrayIcon>
+#include <QWidget>
+#include <QtGui>
 
-#include "fs-watcher.hpp"
 #include "dispatcher.hpp"
+#include "fs-watcher.hpp"
 #include "server.hpp"
 #include <boost/thread/thread.hpp>
 
@@ -50,7 +50,7 @@
 {
   Q_OBJECT
 
-  public:
+public:
   // constructor
   explicit ChronoShareGui(QWidget* parent = 0);
 
@@ -59,83 +59,102 @@
 
 private slots:
   // open the shared folder
-  void openSharedFolder();
+  void
+  openSharedFolder();
 
-  void openFile();
+  void
+  openFile();
 
-  void openInWebBrowser();
+  void
+  openInWebBrowser();
 
-  void updateRecentFilesMenu();
+  void
+  updateRecentFilesMenu();
 
   // open file dialog
-  void openFileDialog();
+  void
+  openFileDialog();
 
   // handle left click of tray icon
-  void trayIconClicked(QSystemTrayIcon::ActivationReason reason);
+  void
+  trayIconClicked(QSystemTrayIcon::ActivationReason reason);
 
   // view chronoshare settings
-  void viewSettings();
+  void
+  viewSettings();
 
   // change chronoshare settings
-  void changeSettings();
+  void
+  changeSettings();
 
   // click on adhoc button
-  void onAdHocChange (bool state); // cannot be protected with #ifdef. otherwise something fishy with QT
+  void
+  onAdHocChange(bool state); // cannot be protected with #ifdef. otherwise something fishy with QT
 
-  void onCheckForUpdates();
+  void
+  onCheckForUpdates();
 
 private:
-  void checkFileAction(const std::string &, int, int);
+  void
+  checkFileAction(const std::string&, int, int);
   // create actions that result from clicking a menu option
-  void createActionsAndMenu();
+  void
+  createActionsAndMenu();
 
   // create tray icon
-  void createTrayIcon();
+  void
+  createTrayIcon();
 
   // set icon image
-  void setIcon();
+  void
+  setIcon();
 
   // load persistent settings
-  bool loadSettings();
+  bool
+  loadSettings();
 
   // save persistent settings
-  void saveSettings();
+  void
+  saveSettings();
 
   // prompt user dialog box
-  void openMessageBox(QString title, QString text);
+  void
+  openMessageBox(QString title, QString text);
 
   // overload
-  void openMessageBox(QString title, QString text, QString infotext);
+  void
+  openMessageBox(QString title, QString text, QString infotext);
 
   // capture close event
-  void closeEvent(QCloseEvent* event);
+  void
+  closeEvent(QCloseEvent* event);
 
   // starts/restarts fs watcher and dispatcher
   void
-  startBackend(bool restart=false);
+  startBackend(bool restart = false);
 
 private:
   QSystemTrayIcon* m_trayIcon; // tray icon
-  QMenu* m_trayIconMenu; // tray icon menu
+  QMenu* m_trayIconMenu;       // tray icon menu
 
-  QAction* m_openFolder; // open the shared folder action
+  QAction* m_openFolder;   // open the shared folder action
   QAction* m_viewSettings; // chronoShare settings
   QAction* m_changeFolder; // change the shared folder action
-  QAction* m_quitProgram; // quit program action
-  QAction *m_checkForUpdates;
-  QAction *m_openWeb;
-  QMenu *m_recentFilesMenu;
-  QAction *m_fileActions[5];
+  QAction* m_quitProgram;  // quit program action
+  QAction* m_checkForUpdates;
+  QAction* m_openWeb;
+  QMenu* m_recentFilesMenu;
+  QAction* m_fileActions[5];
 
-  QAction *m_wifiAction;
+  QAction* m_wifiAction;
 
-  QString m_dirPath; // shared directory
-  QString m_username; // username
+  QString m_dirPath;          // shared directory
+  QString m_username;         // username
   QString m_sharedFolderName; // shared folder name
 
-  FsWatcher  *m_watcher;
-  Dispatcher *m_dispatcher;
-  http::server::server *m_httpServer;
+  FsWatcher* m_watcher;
+  Dispatcher* m_dispatcher;
+  http::server::server* m_httpServer;
   boost::thread m_httpServerThread;
 
   QLabel* labelUsername;
@@ -145,15 +164,15 @@
   QLineEdit* editUsername;
   QLineEdit* editSharedFolder;
   QLineEdit* editSharedFolderPath;
-  QLabel *label;
-  QVBoxLayout *mainLayout;
+  QLabel* label;
+  QVBoxLayout* mainLayout;
 
 #ifdef ADHOC_SUPPORTED
   Executor m_executor;
 #endif
 
 #ifdef SPARKLE_SUPPORTED
-  AutoUpdate *m_autoUpdate;
+  AutoUpdate* m_autoUpdate;
 #endif
   // QString m_settingsFilePath; // settings file path
   // QString m_settings;
diff --git a/gui/html/chronoshare-helpers.js b/gui/html/chronoshare-helpers.js
index b13c767..f1e9aa1 100644
--- a/gui/html/chronoshare-helpers.js
+++ b/gui/html/chronoshare-helpers.js
@@ -1,39 +1,47 @@
-function number_format( number, decimals, dec_point, thousands_sep ) {
-    // http://kevin.vanzonneveld.net
-    // +   original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
-    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
-    // +     bugfix by: Michael White (http://crestidg.com)
-    // +     bugfix by: Benjamin Lupton
-    // +     bugfix by: Allan Jensen (http://www.winternet.no)
-    // +    revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
-    // *     example 1: number_format(1234.5678, 2, '.', '');
-    // *     returns 1: 1234.57
+function number_format(number, decimals, dec_point, thousands_sep)
+{
+  // http://kevin.vanzonneveld.net
+  // +   original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
+  // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
+  // +     bugfix by: Michael White (http://crestidg.com)
+  // +     bugfix by: Benjamin Lupton
+  // +     bugfix by: Allan Jensen (http://www.winternet.no)
+  // +    revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
+  // *     example 1: number_format(1234.5678, 2, '.', '');
+  // *     returns 1: 1234.57
 
-    var n = number, c = isNaN(decimals = Math.abs(decimals)) ? 2 : decimals;
-    var d = dec_point == undefined ? "," : dec_point;
-    var t = thousands_sep == undefined ? "." : thousands_sep, s = n < 0 ? "-" : "";
-    var i = parseInt(n = Math.abs(+n || 0).toFixed(c)) + "", j = (j = i.length) > 3 ? j % 3 : 0;
+  var n = number, c = isNaN(decimals = Math.abs(decimals)) ? 2 : decimals;
+  var d = dec_point == undefined ? "," : dec_point;
+  var t = thousands_sep == undefined ? "." : thousands_sep, s = n < 0 ? "-" : "";
+  var i = parseInt(n = Math.abs(+n || 0).toFixed(c)) + "",
+      j = (j = i.length) > 3 ? j % 3 : 0;
 
-    return s + (j ? i.substr(0, j) + t : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + t) + (c ? d + Math.abs(n - i).toFixed(c).slice(2) : "");
+  return s + (j ? i.substr(0, j) + t : "") +
+         i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + t) +
+         (c ? d + Math.abs(n - i).toFixed(c).slice(2) : "");
 }
 
-function SegNumToFileSize (segNum) {
-    filesize = segNum * 1024;
+function SegNumToFileSize(segNum)
+{
+  filesize = segNum * 1024;
 
-    if (filesize >= 1073741824) {
-	filesize = number_format(filesize / 1073741824, 2, '.', '') + ' Gb';
-    } else {
-	if (filesize >= 1048576) {
-     	    filesize = number_format(filesize / 1048576, 2, '.', '') + ' Mb';
-   	} else {
-	    if (filesize > 1024) {
-    		filesize = number_format(filesize / 1024, 0) + ' Kb';
-  	    } else {
-    		filesize = '< 1 Kb';
-	    };
- 	};
+  if (filesize >= 1073741824) {
+    filesize = number_format(filesize / 1073741824, 2, '.', '') + ' Gb';
+  }
+  else {
+    if (filesize >= 1048576) {
+      filesize = number_format(filesize / 1048576, 2, '.', '') + ' Mb';
+    }
+    else {
+      if (filesize > 1024) {
+        filesize = number_format(filesize / 1024, 0) + ' Kb';
+      }
+      else {
+        filesize = '< 1 Kb';
+      };
     };
-    return filesize;
+  };
+  return filesize;
 };
 
 /**
@@ -42,107 +50,115 @@
  *
  * Note that if string length is odd, null will be returned
  */
-StringHashToUint8Array = function (str) {
-    if (str.length % 2 != 0) {
-        return null;
-    }
+StringHashToUint8Array = function(str) {
+  if (str.length % 2 != 0) {
+    return null;
+  }
 
-    var buf = new Uint8Array (str.length / 2);
+  var buf = new Uint8Array(str.length / 2);
 
-    for (var i = 0; i < str.length; i+=2) {
-        value = parseInt (str.substring (i, i+2), 16);
-        buf[i/2] = value;
-    }
+  for (var i = 0; i < str.length; i += 2) {
+    value = parseInt(str.substring(i, i + 2), 16);
+    buf[i / 2] = value;
+  }
 
-    return buf;
+  return buf;
 };
 
-imgFullPath = function (imgName) {
-    return "images/" + imgName + ".png";
+imgFullPath =
+  function(imgName) {
+  return "images/" + imgName + ".png";
 }
 
-fileExtension = function (fileName) {
-    defaultExtension = "file";
-    knownExtensions = ["ai", "aiff", "bib", "bz2", "c", "chm", "conf", "cpp", "css", "csv", "deb", "divx", "doc", "file", "gif", "gz", "hlp", "htm", "html", "iso", "jpeg", "jpg", "js", "mov", "mp3", "mpg", "odc", "odf", "odg", "odi", "odp", "ods", "odt", "ogg", "pdf", "pgp", "php", "pl", "png", "ppt", "pptx", "ps", "py", "ram", "rar", "rb", "rm", "rpm", "rtf", "sql", "swf", "sxc", "sxd", "sxi", "sxw", "tar", "tex", "tgz", "txt", "vcf", "wav", "wma", "wmv", "xls", "xml", "xpi", "xvid", "zip"];
+fileExtension = function(fileName) {
+  defaultExtension = "file";
+  knownExtensions = [
+    "ai",   "aiff", "bib", "bz2",  "c",   "chm", "conf", "cpp", "css",  "csv",
+    "deb",  "divx", "doc", "file", "gif", "gz",  "hlp",  "htm", "html", "iso",
+    "jpeg", "jpg",  "js",  "mov",  "mp3", "mpg", "odc",  "odf", "odg",  "odi",
+    "odp",  "ods",  "odt", "ogg",  "pdf", "pgp", "php",  "pl",  "png",  "ppt",
+    "pptx", "ps",   "py",  "ram",  "rar", "rb",  "rm",   "rpm", "rtf",  "sql",
+    "swf",  "sxc",  "sxd", "sxi",  "sxw", "tar", "tex",  "tgz", "txt",  "vcf",
+    "wav",  "wma",  "wmv", "xls",  "xml", "xpi", "xvid", "zip"
+  ];
 
-    extStart = fileName.lastIndexOf('.');
-    if (extStart < 0) {
-	return imgFullPath (defaultExtension);
-    }
+  extStart = fileName.lastIndexOf('.');
+  if (extStart < 0) {
+    return imgFullPath(defaultExtension);
+  }
 
-    extension = fileName.substr (extStart+1);
-    // return imgFullPath (extension);
-    if ($.inArray(extension, knownExtensions) >= 0) {
-    	return extension;
-    }
-    else {
-    	return defaultExtension;
-    }
+  extension = fileName.substr(extStart + 1);
+  // return imgFullPath (extension);
+  if ($.inArray(extension, knownExtensions) >= 0) {
+    return extension;
+  }
+  else {
+    return defaultExtension;
+  }
 };
 
 
-openHistoryForItem = function (fileName) {
-    url = new HistoryClosure (null).base_no_item_url ("fileHistory")
-    url += "&item=" + encodeURIComponent (encodeURIComponent (fileName));
-    document.location = url;
+openHistoryForItem = function(fileName) {
+  url = new HistoryClosure(null).base_no_item_url("fileHistory")
+  url += "&item=" + encodeURIComponent(encodeURIComponent(fileName));
+  document.location = url;
 };
 
-displayContent = function (newcontent, more, baseUrl) {
+displayContent = function(newcontent, more, baseUrl) {
 
-    $("#content").fadeOut ("fast", function () {
-        $(this).replaceWith (newcontent);
-        $("#content").fadeIn ("fast");
-    });
+  $("#content").fadeOut("fast", function() {
+    $(this).replaceWith(newcontent);
+    $("#content").fadeIn("fast");
+  });
 
-    $("#content-nav").fadeOut ("fast", function () {
-        $("#content-nav a").hide ();
+  $("#content-nav").fadeOut("fast", function() {
+    $("#content-nav a").hide();
 
-        if (PARAMS.offset !== undefined || more !== undefined) {
-            $("#content-nav").fadeIn ("fast");
+    if (PARAMS.offset !== undefined || more !== undefined) {
+      $("#content-nav").fadeIn("fast");
 
-            if (more !== undefined) {
-                $("#get-more").show ();
+      if (more !== undefined) {
+        $("#get-more").show();
 
-                $("#get-more").unbind ('click').click (function () {
-                    url = baseUrl;
-                    url += "&offset="+more;
+        $("#get-more").unbind('click').click(function() {
+          url = baseUrl;
+          url += "&offset=" + more;
 
-                    document.location = url;
-                });
-            }
-            if (PARAMS.offset > 0) {
-                $("#get-less").show ();
+          document.location = url;
+        });
+      }
+      if (PARAMS.offset > 0) {
+        $("#get-less").show();
 
-                $("#get-less").unbind ('click').click (function () {
-                    url = baseUrl;
-                    if (PARAMS.offset > 5) {
-                        url += "&offset="+(PARAMS.offset - 5);
-                    }
+        $("#get-less").unbind('click').click(function() {
+          url = baseUrl;
+          if (PARAMS.offset > 5) {
+            url += "&offset=" + (PARAMS.offset - 5);
+          }
 
-                    document.location = url;
-                });
-            }
-        }
-    });
+          document.location = url;
+        });
+      }
+    }
+  });
 };
 
-function custom_alert (output_msg, title_msg)
+function custom_alert(output_msg, title_msg)
 {
-    if (!title_msg)
-        title_msg = 'Alert';
+  if (!title_msg)
+    title_msg = 'Alert';
 
-    if (!output_msg)
-        output_msg = 'No Message to Display';
+  if (!output_msg)
+    output_msg = 'No Message to Display';
 
-    $("<div></div>").html(output_msg).dialog({
-        title: title_msg,
-        resizable: false,
-        modal: true,
-        buttons: {
-            "Ok": function()
-            {
-                $( this ).dialog( "close" );
-            }
-        }
-    });
+  $("<div></div>").html(output_msg).dialog({
+    title: title_msg,
+    resizable: false,
+    modal: true,
+    buttons: {
+      "Ok": function() {
+        $(this).dialog("close");
+      }
+    }
+  });
 }
\ No newline at end of file
diff --git a/gui/html/chronoshare-navigation.js b/gui/html/chronoshare-navigation.js
index 8856ec0..8fdd12b 100644
--- a/gui/html/chronoshare-navigation.js
+++ b/gui/html/chronoshare-navigation.js
@@ -1,83 +1,81 @@
 var CHRONOSHARE;
 
 var PAGE; // no default page anymore (no reason to have)
-var PARAMS = [ ];
+var PARAMS = [];
 var URIPARAMS = "";
 
-function nav_anchor (aurl) {
-    aurl = aurl.split('#');
-    if (aurl[1])
-    {
-        aurl_split = aurl[1].split ('&');
-        page = aurl_split[0];
+function nav_anchor(aurl)
+{
+  aurl = aurl.split('#');
+  if (aurl[1]) {
+    aurl_split = aurl[1].split('&');
+    page = aurl_split[0];
 
-        vars = [ ];
-        for (var i = 1; i < aurl_split.length; i++)
-        {
-            hash = aurl_split[i].split('=');
-            vars.push(hash[0]);
-            // there is strange double-encoding problem...
-            vars[hash[0]] = decodeURIComponent (decodeURIComponent (hash[1]));
-        }
-
-        // if (page != PAGE)
-        // {
-        //     PAGE = page;
-        //     PARAMS = vars;
-        //     URIPARAMS = aurl[1];
-
-        //     if (CHRONOSHARE) {
-        //         CHRONOSHARE.run ();
-        //     }
-        // }
-        // else if (aurl[1] != URIPARAMS)
-        // {
-        //     PARAMS = vars;
-        //     URIPARAMS = aurl[1];
-
-        //     if (CHRONOSHARE) {
-        //         CHRONOSHARE.run ();
-        //     }
-        // }
-
-        // this way we can reload by just clicking on the same link
-        PAGE = page;
-        PARAMS = vars;
-        URIPARAMS = aurl[1];
-
-        if (CHRONOSHARE) {
-            CHRONOSHARE.run ();
-        }
+    vars = [];
+    for (var i = 1; i < aurl_split.length; i++) {
+      hash = aurl_split[i].split('=');
+      vars.push(hash[0]);
+      // there is strange double-encoding problem...
+      vars[hash[0]] = decodeURIComponent(decodeURIComponent(hash[1]));
     }
+
+    // if (page != PAGE)
+    // {
+    //     PAGE = page;
+    //     PARAMS = vars;
+    //     URIPARAMS = aurl[1];
+
+    //     if (CHRONOSHARE) {
+    //         CHRONOSHARE.run ();
+    //     }
+    // }
+    // else if (aurl[1] != URIPARAMS)
+    // {
+    //     PARAMS = vars;
+    //     URIPARAMS = aurl[1];
+
+    //     if (CHRONOSHARE) {
+    //         CHRONOSHARE.run ();
+    //     }
+    // }
+
+    // this way we can reload by just clicking on the same link
+    PAGE = page;
+    PARAMS = vars;
+    URIPARAMS = aurl[1];
+
+    if (CHRONOSHARE) {
+      CHRONOSHARE.run();
+    }
+  }
 }
 
-$(document).ready (function () {
-    nav_anchor (window.location.href);
+$(document).ready(function() {
+  nav_anchor(window.location.href);
 
-    if (!PARAMS.user || !PARAMS.folder)
-    {
-        $("#error").html ("user and folder must be be specified in the URL");
-        $("#error").removeClass ("hidden");
-        return;
-    }
-    else {
-        // update in-page URLs
-        $(".needs-get-url").each (function (index,element) {
-            this.href += "&user="+encodeURIComponent (encodeURIComponent (PARAMS.user))
-                + "&folder="+encodeURIComponent (encodeURIComponent (PARAMS.folder));
-        });
-        $(".needs-get-url").removeClass ("needs-get-url");
-    }
-
-    CHRONOSHARE = new ChronoShare (PARAMS.user, PARAMS.folder);
-    CHRONOSHARE.run ();
-
-    $(window).on('hashchange', function() {
-        nav_anchor (window.location.href);
+  if (!PARAMS.user || !PARAMS.folder) {
+    $("#error").html("user and folder must be be specified in the URL");
+    $("#error").removeClass("hidden");
+    return;
+  }
+  else {
+    // update in-page URLs
+    $(".needs-get-url").each(function(index, element) {
+      this.href +=
+        "&user=" + encodeURIComponent(encodeURIComponent(PARAMS.user)) +
+        "&folder=" + encodeURIComponent(encodeURIComponent(PARAMS.folder));
     });
+    $(".needs-get-url").removeClass("needs-get-url");
+  }
 
-    $("#reload-button").click (function() {
-        nav_anchor (window.location.href);
-    });
+  CHRONOSHARE = new ChronoShare(PARAMS.user, PARAMS.folder);
+  CHRONOSHARE.run();
+
+  $(window).on('hashchange', function() {
+    nav_anchor(window.location.href);
+  });
+
+  $("#reload-button").click(function() {
+    nav_anchor(window.location.href);
+  });
 });
-
diff --git a/gui/html/chronoshare.js b/gui/html/chronoshare.js
index 1c91c84..38743ad 100644
--- a/gui/html/chronoshare.js
+++ b/gui/html/chronoshare.js
@@ -1,476 +1,570 @@
-$.Class ("ChronoShare", { },
- {
-     init: function (username, foldername) {
-         $("#folder-name").text (foldername);
-         $("#user-name").text (username);
+$.Class("ChronoShare", {}, {
+  init: function(username, foldername) {
+    $("#folder-name").text(foldername);
+    $("#user-name").text(username);
 
-         this.username = new Name (username);
-         this.files = new Name ("/localhost").add (this.username).add ("chronoshare").add (foldername).add ("info").add ("files").add ("folder");
+    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");
+    this.actions = new Name("/localhost")
+                     .add(this.username)
+                     .add("chronoshare")
+                     .add(foldername)
+                     .add("info")
+                     .add("actions");
 
-         this.restore = new Name ("/localhost").add (this.username).add ("chronoshare").add (foldername).add ("cmd").add ("restore").add ("file");
+    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"});
-	 this.ndn.verify = false; //disable content verification, works WAAAAY faster
-     },
+    this.ndn = new NDN({host: "127.0.0.1"});
+    this.ndn.verify = false; // disable content verification, works WAAAAY faster
+  },
 
-     run: function () {
-         console.log ("RUN page: " + PAGE);
-         $("#loader").fadeIn (500);
-         $("#error").addClass ("hidden");
+  run: function() {
+    console.log("RUN page: " + PAGE);
+    $("#loader").fadeIn(500);
+    $("#error").addClass("hidden");
 
-         cmd = {};
-         if (PAGE == "fileList") {
-             cmd = this.info_files (PARAMS.item);
-         }
-         else if (PAGE == "folderHistory") {
-             cmd = this.info_actions ("folder", PARAMS.item);
-         }
-         else if (PAGE == "fileHistory") {
-             cmd = this.info_actions ("file", PARAMS.item);
-         }
+    cmd = {};
+    if (PAGE == "fileList") {
+      cmd = this.info_files(PARAMS.item);
+    }
+    else if (PAGE == "folderHistory") {
+      cmd = this.info_actions("folder", PARAMS.item);
+    }
+    else if (PAGE == "fileHistory") {
+      cmd = this.info_actions("file", PARAMS.item);
+    }
 
-         if (cmd.request && cmd.callback) {
-             console.log (cmd.request.to_uri ());
-             this.ndn.expressInterest (cmd.request, cmd.callback);
-         }
-         else {
-             $("#loader").fadeOut (500); // ("hidden");
-             $("#content").empty ();
-             if (cmd.error) {
-                 $("#error").html (cmd.error);
-             }
-             else {
-                 $("#error").html ("Unknown error with " + PAGE);
-             }
-             $("#error").removeClass ("hidden");
-         }
-     },
+    if (cmd.request && cmd.callback) {
+      console.log(cmd.request.to_uri());
+      this.ndn.expressInterest(cmd.request, cmd.callback);
+    }
+    else {
+      $("#loader").fadeOut(500); // ("hidden");
+      $("#content").empty();
+      if (cmd.error) {
+        $("#error").html(cmd.error);
+      }
+      else {
+        $("#error").html("Unknown error with " + PAGE);
+      }
+      $("#error").removeClass("hidden");
+    }
+  },
 
-     info_files: function(folder) {
-         request = new Name ().add (this.files)./*add (folder_in_question).*/addSegment (PARAMS.offset?PARAMS.offset:0);
-         return { request:request, callback: new FilesClosure (this) };
-     },
+  info_files: function(folder) {
+    request = new Name()
+                .add(this.files)
+                ./*add (folder_in_question).*/ addSegment(
+                  PARAMS.offset ? PARAMS.offset : 0);
+    return {request: request, callback: new FilesClosure(this)};
+  },
 
-     info_actions: function (type/*"file" or "folder"*/, fileOrFolder /*file or folder name*/) {
-         if (type=="file" && !fileOrFolder) {
-             return { error: "info_actions: fileOrFolder parameter is missing" };
-         }
+  info_actions: function(type /*"file" or "folder"*/,
+                         fileOrFolder /*file or folder name*/) {
+    if (type == "file" && !fileOrFolder) {
+      return {error: "info_actions: fileOrFolder parameter is missing"};
+    }
 
-         request = new Name ().add (this.actions).add (type);
-         if (fileOrFolder) {
-             request.add (fileOrFolder);
-         }
-         request.addSegment (PARAMS.offset?PARAMS.offset:0);
-         return { request: request, callback: new HistoryClosure (this) };
-     },
+    request = new Name().add(this.actions).add(type);
+    if (fileOrFolder) {
+      request.add(fileOrFolder);
+    }
+    request.addSegment(PARAMS.offset ? PARAMS.offset : 0);
+    return {request: request, callback: new HistoryClosure(this)};
+  },
 
-     cmd_restore_file: function (filename, version, hash, callback/*function (bool <- data received, status <- returned status)*/) {
-         request = new Name ().add (this.restore)
-             .add (filename)
-             .addSegment (version)
-             .add (hash);
-         console.log (request.to_uri ());
-	 this.ndn.expressInterest (request, new CmdRestoreFileClosure (this, callback));
-     },
-
-     get_file: function (modifiedBy, hash, segments, callback/*function (bool <- data received, data <- returned data)*/) {
-         baseName = new Name (modifiedBy)
-             .add ("chronoshare").add ("file")
-             .add (hash);
-
-         new FileGetter (this.ndn, baseName, segments, callback)
-             .start ();
-     }
- });
-
-$.Class ("CmdRestoreFileClosure", {}, {
-    init: function (chronoshare, callback) {
-        this.chronoshare = chronoshare;
-	this.callback = callback;
+  cmd_restore_file:
+    function(filename, version, hash,
+             callback /*function (bool <- data received, status <- returned status)*/) {
+      request =
+        new Name().add(this.restore).add(filename).addSegment(version).add(hash);
+      console.log(request.to_uri());
+      this.ndn.expressInterest(request,
+                               new CmdRestoreFileClosure(this, callback));
     },
-    upcall: function(kind, upcallInfo) {
-        if (kind == Closure.UPCALL_CONTENT || kind == Closure.UPCALL_CONTENT_UNVERIFIED) { //disable content verification
-            convertedData = DataUtils.toString (upcallInfo.contentObject.content);
-	    this.callback (true, convertedData);
-	}
-        else if (kind == Closure.UPCALL_INTEREST_TIMED_OUT) {
-	    this.callback (false, "Interest timed out");
-        }
-        else {
-	    this.callback (false, "Unknown error happened");
-        }
+
+  get_file:
+    function(modifiedBy, hash, segments,
+             callback /*function (bool <- data received, data <- returned data)*/) {
+      baseName = new Name(modifiedBy).add("chronoshare").add("file").add(hash);
+
+      new FileGetter(this.ndn, baseName, segments, callback).start();
     }
 });
 
-$.Class ("FileGetter", {}, {
-    init: function (ndn, baseName, segments, callback) {
-        this.ndn = ndn;
-        this.callback = callback;
-        this.baseName = baseName;
-        this.segments = segments;
-        this.lastSegmentRequested = -1;
-
-        this.data = "";
-    },
-
-    start: function () {
-        this.lastSegmentRequested ++;
-
-        request = new Name ()
-            .add (this.baseName)
-            .addSegment (this.lastSegmentRequested);
-
-        console.log (request.to_uri ());
-	this.ndn.expressInterest (request, this);
-    },
-
-    upcall: function(kind, upcallInfo) {
-        if (kind == Closure.UPCALL_CONTENT || kind == Closure.UPCALL_CONTENT_UNVERIFIED) { //disable content verification
-            convertedData = DataUtils.toString (upcallInfo.contentObject.content);
-
-            this.data += convertedData;
-
-            if (this.lastSegmentRequested+1 == this.segments) {
-                this.callback (true, this.data);
-            }
-            else {
-                this.start ();
-            }
-        }
-        else {
-	    this.callback (false, "Interest timed out");
-        }
+$.Class("CmdRestoreFileClosure", {}, {
+  init: function(chronoshare, callback) {
+    this.chronoshare = chronoshare;
+    this.callback = callback;
+  },
+  upcall: function(kind, upcallInfo) {
+    if (kind == Closure.UPCALL_CONTENT ||
+        kind == Closure.UPCALL_CONTENT_UNVERIFIED) { // disable content verification
+      convertedData = DataUtils.toString(upcallInfo.contentObject.content);
+      this.callback(true, convertedData);
     }
+    else if (kind == Closure.UPCALL_INTEREST_TIMED_OUT) {
+      this.callback(false, "Interest timed out");
+    }
+    else {
+      this.callback(false, "Unknown error happened");
+    }
+  }
 });
 
-$.Class ("RestPipelineClosure", {}, {
-    init: function (collectionName, moreName) {
-	this.collectionName = collectionName;
-	this.moreName = moreName;
-	$("#json").empty ();
+$.Class("FileGetter", {}, {
+  init: function(ndn, baseName, segments, callback) {
+    this.ndn = ndn;
+    this.callback = callback;
+    this.baseName = baseName;
+    this.segments = segments;
+    this.lastSegmentRequested = -1;
 
-	this.collection = [];
-        this.counter = 0;
-    },
+    this.data = "";
+  },
 
-    upcall: function(kind, upcallInfo) {
-        if (kind == Closure.UPCALL_CONTENT || kind == Closure.UPCALL_CONTENT_UNVERIFIED) { //disable content verification
+  start: function() {
+    this.lastSegmentRequested++;
 
-            convertedData = DataUtils.toString (upcallInfo.contentObject.content);
-	    if (PARAMS.debug) {
-		$("#json").append ($(document.createTextNode(convertedData)));
-		$("#json").removeClass ("hidden");
-	    }
-            data = JSON.parse (convertedData);
+    request =
+      new Name().add(this.baseName).addSegment(this.lastSegmentRequested);
 
-	    this.collection = this.collection.concat (data[this.collectionName]);
-	    if (data[this.moreName] !== undefined) {
-		nextSegment = upcallInfo.interest.name.cut (1).addSegment (data[this.moreName]);
-                this.counter ++;
+    console.log(request.to_uri());
+    this.ndn.expressInterest(request, this);
+  },
 
-                if (this.counter < 5) {
-		    console.log ("MORE: " +nextSegment.to_uri ());
-		    CHRONOSHARE.ndn.expressInterest (nextSegment, this);
-                }
-                else {
-		    $("#loader").fadeOut (500); // ("hidden");
-		    this.onData (this.collection, data[this.moreName]);
-                }
-	    }
-	    else {
-		$("#loader").fadeOut (500); // ("hidden");
-		this.onData (this.collection, undefined);
-	    }
-	}
-        else if (kind == Closure.UPCALL_INTEREST_TIMED_OUT) {
-            $("#loader").fadeOut (500); // ("hidden");
-	    this.onTimeout (upcallInfo.interest);
+  upcall: function(kind, upcallInfo) {
+    if (kind == Closure.UPCALL_CONTENT ||
+        kind == Closure.UPCALL_CONTENT_UNVERIFIED) { // disable content verification
+      convertedData = DataUtils.toString(upcallInfo.contentObject.content);
+
+      this.data += convertedData;
+
+      if (this.lastSegmentRequested + 1 == this.segments) {
+        this.callback(true, this.data);
+      }
+      else {
+        this.start();
+      }
+    }
+    else {
+      this.callback(false, "Interest timed out");
+    }
+  }
+});
+
+$.Class("RestPipelineClosure", {}, {
+  init: function(collectionName, moreName) {
+    this.collectionName = collectionName;
+    this.moreName = moreName;
+    $("#json").empty();
+
+    this.collection = [];
+    this.counter = 0;
+  },
+
+  upcall: function(kind, upcallInfo) {
+    if (kind == Closure.UPCALL_CONTENT ||
+        kind == Closure.UPCALL_CONTENT_UNVERIFIED) { // disable content verification
+
+      convertedData = DataUtils.toString(upcallInfo.contentObject.content);
+      if (PARAMS.debug) {
+        $("#json").append($(document.createTextNode(convertedData)));
+        $("#json").removeClass("hidden");
+      }
+      data = JSON.parse(convertedData);
+
+      this.collection = this.collection.concat(data[this.collectionName]);
+      if (data[this.moreName] !== undefined) {
+        nextSegment =
+          upcallInfo.interest.name.cut(1).addSegment(data[this.moreName]);
+        this.counter++;
+
+        if (this.counter < 5) {
+          console.log("MORE: " + nextSegment.to_uri());
+          CHRONOSHARE.ndn.expressInterest(nextSegment, this);
         }
         else {
-            $("#loader").fadeOut (500); // ("hidden");
-	    this.onUnknownError (upcallInfo.interest);
+          $("#loader").fadeOut(500); // ("hidden");
+          this.onData(this.collection, data[this.moreName]);
         }
-
-	return Closure.RESULT_OK; // make sure we never re-express the interest
-    },
-
-    onData: function(data, more) {
-    },
-
-    onTimeout: function () {
-        $("#error").html ("Interest timed out");
-        $("#error").removeClass ("hidden");
-    },
-
-    onUnknownError: function () {
-        $("#error").html ("Unknown error happened");
-        $("#error").removeClass ("hidden");
+      }
+      else {
+        $("#loader").fadeOut(500); // ("hidden");
+        this.onData(this.collection, undefined);
+      }
     }
+    else if (kind == Closure.UPCALL_INTEREST_TIMED_OUT) {
+      $("#loader").fadeOut(500); // ("hidden");
+      this.onTimeout(upcallInfo.interest);
+    }
+    else {
+      $("#loader").fadeOut(500); // ("hidden");
+      this.onUnknownError(upcallInfo.interest);
+    }
+
+    return Closure.RESULT_OK; // make sure we never re-express the interest
+  },
+
+  onData: function(data, more) {},
+
+  onTimeout: function() {
+    $("#error").html("Interest timed out");
+    $("#error").removeClass("hidden");
+  },
+
+  onUnknownError: function() {
+    $("#error").html("Unknown error happened");
+    $("#error").removeClass("hidden");
+  }
 });
 
 // $.Class ("FilesClosure", {}, {
-RestPipelineClosure ("FilesClosure", {}, {
-    init: function (chronoshare) {
-	this._super("files", "more");
-        this.chronoshare = chronoshare;
-    },
+RestPipelineClosure("FilesClosure", {}, {
+  init: function(chronoshare) {
+    this._super("files", "more");
+    this.chronoshare = chronoshare;
+  },
 
-    onData: function(data, more) {
-        tbody = $("<tbody />", { "id": "file-list-files" });
+  onData: function(data, more) {
+    tbody = $("<tbody />", {"id": "file-list-files"});
 
-        /// @todo Eventually set title for other pages
-        $("title").text ("ChronoShare - List of files" + (PARAMS.item?" - "+PARAMS.item:""));
+    /// @todo Eventually set title for other pages
+    $("title").text("ChronoShare - List of files" +
+                    (PARAMS.item ? " - " + PARAMS.item : ""));
 
-        // error handling?
-        newcontent = $("<div />", { "id": "content" }).append (
-	    $("<h2 />").append ($(document.createTextNode("List of files ")), $("<green />").text (PARAMS.item)),
-            $("<table />", { "class": "item-list" })
-                .append ($("<thead />")
-                         .append ($("<tr />")
-                                  .append ($("<th />", { "class": "filename border-left", "scope": "col" }).text ("Filename"))
-                                  .append ($("<th />", { "class": "version", "scope": "col" }).text ("Version"))
-                                  .append ($("<th />", { "class": "size", "scope": "col" }).text ("Size"))
-                                  .append ($("<th />", { "class": "modified", "scope": "col" }).text ("Modified"))
-                                  .append ($("<th />", { "class": "modified-by border-right", "scope": "col" }).text ("Modified By"))))
-                .append (tbody)
-                .append ($("<tfoot />")
-                         .append ($("<tr />")
-                                  .append ($("<td />", { "colspan": "5", "class": "border-right border-left" })))));
-        newcontent.hide ();
+    // error handling?
+    newcontent =
+      $("<div />", {"id": "content"})
+        .append($("<h2 />").append($(document.createTextNode("List of files ")),
+                                   $("<green />").text(PARAMS.item)),
+                $("<table />", {"class": "item-list"})
+                  .append(
+                    $("<thead />")
+                      .append($("<tr />")
+                                .append($("<th />", {
+                                          "class": "filename border-left",
+                                          "scope": "col"
+                                        }).text("Filename"))
+                                .append($("<th />",
+                                          {"class": "version", "scope": "col"})
+                                          .text("Version"))
+                                .append($("<th />",
+                                          {"class": "size", "scope": "col"})
+                                          .text("Size"))
+                                .append($("<th />", {
+                                          "class": "modified",
+                                          "scope": "col"
+                                        }).text("Modified"))
+                                .append($("<th />", {
+                                          "class": "modified-by border-right",
+                                          "scope": "col"
+                                        }).text("Modified By"))))
+                  .append(tbody)
+                  .append($("<tfoot />").append($("<tr />").append($("<td />", {
+                    "colspan": "5",
+                    "class": "border-right border-left"
+                  })))));
+    newcontent.hide();
 
-        for (var i = 0; i < data.length; i++) {
-            file = data[i];
+    for (var i = 0; i < data.length; i++) {
+      file = data[i];
 
-	    row = $("<tr />", { "class": "with-context-menu" } );
-	    if (i%2) { row.addClass ("odd"); }
+      row = $("<tr />", {"class": "with-context-menu"});
+      if (i % 2) {
+        row.addClass("odd");
+      }
 
-            row.bind('mouseenter mouseleave', function() {
-                $(this).toggleClass('highlighted');
-            });
+      row.bind('mouseenter mouseleave', function() {
+        $(this).toggleClass('highlighted');
+      });
 
-            row.attr ("filename", file.filename); //encodeURIComponent(encodeURIComponent(file.filename)));
-            row.bind('click', function (e) { openHistoryForItem ($(this).attr ("filename")) });
+      row.attr("filename",
+               file.filename); // encodeURIComponent(encodeURIComponent(file.filename)));
+      row.bind('click', function(e) {
+        openHistoryForItem($(this).attr("filename"))
+      });
 
-	    row.append ($("<td />", { "class": "filename border-left" })
-			.text (file.filename)
-			.prepend ($("<img />", { "src": imgFullPath(fileExtension(file.filename)) })));
-	    row.append ($("<td />", { "class": "version" }).text (file.version));
-	    row.append ($("<td />", { "class": "size" }).text (SegNumToFileSize (file.segNum)));
-	    row.append ($("<td />", { "class": "modified" }).text (new Date (file.timestamp+"+00:00"))); // convert from UTC
-	    row.append ($("<td />", { "class": "modified-by border-right"})
-			.append ($("<userName />").text (file.owner.userName))
-			.append ($("<seqNo> /").text (file.owner.seqNo)));
+      row.append(
+        $("<td />", {"class": "filename border-left"})
+          .text(file.filename)
+          .prepend(
+            $("<img />", {"src": imgFullPath(fileExtension(file.filename))})));
+      row.append($("<td />", {"class": "version"}).text(file.version));
+      row.append(
+        $("<td />", {"class": "size"}).text(SegNumToFileSize(file.segNum)));
+      row.append($("<td />", {
+                   "class": "modified"
+                 }).text(new Date(file.timestamp + "+00:00"))); // convert from UTC
+      row.append($("<td />", {"class": "modified-by border-right"})
+                   .append($("<userName />").text(file.owner.userName))
+                   .append($("<seqNo> /").text(file.owner.seqNo)));
 
-	    tbody = tbody.append (row);
-        }
-
-        displayContent (newcontent, more, this.base_url ());
-
-	$.contextMenu( 'destroy',  ".with-context-menu" ); // cleanup
-	$.contextMenu({
-	    selector: ".with-context-menu",
-	    items: {
-		"info": {name: "x", type: "html", html: "<b>File operations</b>"},
-		"sep1": "---------",
-		history: {name: "View file history",
-			  icon: "quit", // need a better icon
-			  callback: function(key, opt) {
-			      openHistoryForItem (opt.$trigger.attr ("filename"));
-			  }},
-	    }
-	});
-    },
-
-    base_url: function () {
-        url = "#fileList"+
-            "&user="+encodeURIComponent (encodeURIComponent (PARAMS.user)) +
-            "&folder="+encodeURIComponent (encodeURIComponent (PARAMS.folder));
-        if (PARAMS.item !== undefined) {
-            url += "&item="+encodeURIComponent (encodeURIComponent (PARAMS.item));
-        }
-        return url;
+      tbody = tbody.append(row);
     }
+
+    displayContent(newcontent, more, this.base_url());
+
+    $.contextMenu('destroy', ".with-context-menu"); // cleanup
+    $.contextMenu({
+      selector: ".with-context-menu",
+      items: {
+        "info": {name: "x", type: "html", html: "<b>File operations</b>"},
+        "sep1": "---------",
+        history: {
+          name: "View file history",
+          icon: "quit", // need a better icon
+          callback: function(key, opt) {
+            openHistoryForItem(opt.$trigger.attr("filename"));
+          }
+        },
+      }
+    });
+  },
+
+  base_url: function() {
+    url = "#fileList" +
+          "&user=" + encodeURIComponent(encodeURIComponent(PARAMS.user)) +
+          "&folder=" + encodeURIComponent(encodeURIComponent(PARAMS.folder));
+    if (PARAMS.item !== undefined) {
+      url += "&item=" + encodeURIComponent(encodeURIComponent(PARAMS.item));
+    }
+    return url;
+  }
 });
 
+RestPipelineClosure("HistoryClosure", {}, {
+  init: function(chronoshare) {
+    this._super("actions", "more");
+    this.chronoshare = chronoshare;
+  },
 
-RestPipelineClosure ("HistoryClosure", {}, {
-    init: function (chronoshare) {
-	this._super("actions", "more");
-        this.chronoshare = chronoshare;
-    },
-
-    previewFile: function (file) {
-        if (fileExtension(file.attr ("filename")) == "txt") {
-            CHRONOSHARE.get_file (file.attr ("file_modified_by"),
-                                  DataUtils.toNumbers (file.attr ("file_hash")),
-                                  file.attr ("file_seg_num"),
-                                  function (status, data) {
-			              $("<div />", { "title": "Preview of " + file.attr ("filename") + " version " + file.attr ("file_version") })
-                                          .append ($("<pre />").text (data))
-			                  .dialog ({
-			                      resizable: true,
-			                      width: $(window).width() * 0.8,
-                                              maxHeight: $(window).height() * 0.8,
-                                              show: "blind",
-                                              hide: "fold",
-			                      modal: true,
-			                  });
-                                  });
-        }
-        else {
-            custom_alert ("Preview is not support for this type of file");
-        }
-    },
-
-    onData: function(data, more) {
-        tbody = $("<tbody />", { "id": "history-list-actions" });
-
-        /// @todo Eventually set title for other pages
-        $("title").text ("ChronoShare - Recent actions" + (PARAMS.item?" - "+PARAMS.item:""));
-
-        newcontent = $("<div />", { "id": "content" }).append (
-	    $("<h2 />").append ($(document.createTextNode("Recent actions ")), $("<green />").text (PARAMS.item)),
-            $("<table />", { "class": "item-list" })
-                .append ($("<thead />")
-                         .append ($("<tr />")
-                                  .append ($("<th />", { "class": "filename border-left", "scope": "col" }).text ("Filename"))
-                                  .append ($("<th />", { "class": "version", "scope": "col" }).text ("Version"))
-                                  .append ($("<th />", { "class": "size", "scope": "col" }).text ("Size"))
-                                  .append ($("<th />", { "class": "modified", "scope": "col" }).text ("Modified"))
-                                  .append ($("<th />", { "class": "modified-by border-right", "scope": "col" }).text ("Modified By"))))
-                .append (tbody)
-                .append ($("<tfoot />")
-                         .append ($("<tr />")
-                                  .append ($("<td />", { "colspan": "5", "class": "border-right border-left" })))));
-
-        for (var i = 0; i < data.length; i++) {
-            action = data[i];
-
-	    row = $("<tr />");
-	    if (i%2) { row.addClass ("odd"); }
-            if (action.action=="DELETE") {
-		row.addClass ("delete");
-	    }
-	    else {
-		row.addClass ("with-context-menu");
-                row.attr ("file_version", action.version);
-		row.attr ("file_hash", action.update.hash);
-		row.attr ("file_seg_num", action.update.segNum);
-		row.attr ("file_modified_by", action.id.userName);
-	    }
-
-            row.attr ("filename", action.filename);
-
-            self = this;
-            if (PARAMS.item != action.filename) {
-                row.bind('click', function (e) { openHistoryForItem ($(this).attr ("filename")) });
-            }
-            else {
-                row.bind('click', function (e) {
-                    self.previewFile ($(this));
-                });
-            }
-
-            row.bind('mouseenter mouseleave', function() {
-                $(this).toggleClass('highlighted');
-            });
-
-	    row.append ($("<td />", { "class": "filename border-left" })
-			.text (action.filename)
-			.prepend ($("<img />", { "src": imgFullPath(fileExtension(action.filename)) })));
-	    row.append ($("<td />", { "class": "version" }).text (action.version));
-	    row.append ($("<td />", { "class": "size" }).text (action.update?SegNumToFileSize (action.update.segNum):""));
-	    row.append ($("<td />", { "class": "timestamp" }).text (new Date (action.timestamp+"+00:00"))); // conversion from UTC timezone (we store action time in UTC)
-	    row.append ($("<td />", { "class": "modified-by border-right" })
-	        	.append ($("<userName />").text (action.id.userName))
-	        	.append ($("<seqNo> /").text (action.id.seqNo)));
-
-	    tbody = tbody.append (row);
-        }
-
-        displayContent (newcontent, more, this.base_url (PAGE));
-
-        self = this;
-	$.contextMenu( 'destroy',  ".with-context-menu" ); // cleanup
-	$.contextMenu({
-	    selector: ".with-context-menu",
-	    items: {
-		"sep1": "---------",
-                preview: {name: "Preview revision",
-                          icon: "edit", // ned a better icon
-                          callback: function(key, opt) {
-                              self.previewFile (opt.$trigger);
-                          }},
-		"sep3": "---------",
-		restore: {name: "Restore this revision",
-			  icon: "cut", // need a better icon
-			  callback: function(key, opt) {
-			      filename = opt.$trigger.attr ("filename");
-			      version = opt.$trigger.attr ("file_version");
-			      hash = DataUtils.toNumbers (opt.$trigger.attr ("file_hash"));
-			      console.log (hash);
-			      modified_by = opt.$trigger.attr ("file_modified_by");
-
-			      $("<div />", { "title": "Restore version " + version + "?" })
-				  .append ($("<p />")
-					   .append ($("<span />", { "class": "ui-icon ui-icon-alert",
-								    "style": "float: left; margin: 0 7px 50px 0;" }),
-						    $(document.createTextNode ("Are you sure you want restore version ")),
-						    $("<green/>").text (version),
-						    $(document.createTextNode (" by ")),
-						    $("<green/>").text (modified_by)))
-				  .dialog ({
-				      resizable: true,
-				      height:200,
-				      width:300,
-				      modal: true,
-                                      show: "blind",
-                                      hide: "fold",
-				      buttons: {
-					  "Restore": function() {
-					      self = $(this);
-					      CHRONOSHARE.cmd_restore_file (filename, version, hash, function(didGetData, response) {
-						  if (!didGetData || response != "OK") {
-						      custom_alert (response);
-						  }
-						  console.log (response);
-						  self.dialog ("close");
-
-						  $.timer (function() {CHRONOSHARE.run ();}).once (1000);
-					      });
-					  },
-					  Cancel: function() {
-					      $(this).dialog ("close");
-					  }
-				      }
-				  });
-			      // openHistoryForItem (opt.$trigger.attr ("filename"));
-			  }},
-		"sep2": "---------",
-	    }
-	});
-    },
-
-    base_no_item_url: function (page) {
-        url = "#"+page+
-            "&user="+encodeURIComponent (encodeURIComponent (PARAMS.user)) +
-            "&folder="+encodeURIComponent (encodeURIComponent (PARAMS.folder));
-        return url;
-    },
-
-    base_url: function (page) {
-        url = "#"+page+
-            "&user="+encodeURIComponent (encodeURIComponent (PARAMS.user)) +
-            "&folder="+encodeURIComponent (encodeURIComponent (PARAMS.folder));
-        if (PARAMS.item !== undefined) {
-            url += "&item="+encodeURIComponent (encodeURIComponent (PARAMS.item));
-        }
-        return url;
+  previewFile: function(file) {
+    if (fileExtension(file.attr("filename")) == "txt") {
+      CHRONOSHARE.get_file(file.attr("file_modified_by"),
+                           DataUtils.toNumbers(file.attr("file_hash")),
+                           file.attr("file_seg_num"), function(status, data) {
+                             $("<div />", {
+                               "title": "Preview of " + file.attr("filename") +
+                                          " version " + file.attr("file_version")
+                             })
+                               .append($("<pre />").text(data))
+                               .dialog({
+                                 resizable: true,
+                                 width: $(window).width() * 0.8,
+                                 maxHeight: $(window).height() * 0.8,
+                                 show: "blind",
+                                 hide: "fold",
+                                 modal: true,
+                               });
+                           });
     }
+    else {
+      custom_alert("Preview is not support for this type of file");
+    }
+  },
+
+  onData: function(data, more) {
+    tbody = $("<tbody />", {"id": "history-list-actions"});
+
+    /// @todo Eventually set title for other pages
+    $("title").text("ChronoShare - Recent actions" +
+                    (PARAMS.item ? " - " + PARAMS.item : ""));
+
+    newcontent =
+      $("<div />", {"id": "content"})
+        .append($("<h2 />").append($(document.createTextNode("Recent actions ")),
+                                   $("<green />").text(PARAMS.item)),
+                $("<table />", {"class": "item-list"})
+                  .append(
+                    $("<thead />")
+                      .append($("<tr />")
+                                .append($("<th />", {
+                                          "class": "filename border-left",
+                                          "scope": "col"
+                                        }).text("Filename"))
+                                .append($("<th />",
+                                          {"class": "version", "scope": "col"})
+                                          .text("Version"))
+                                .append($("<th />",
+                                          {"class": "size", "scope": "col"})
+                                          .text("Size"))
+                                .append($("<th />", {
+                                          "class": "modified",
+                                          "scope": "col"
+                                        }).text("Modified"))
+                                .append($("<th />", {
+                                          "class": "modified-by border-right",
+                                          "scope": "col"
+                                        }).text("Modified By"))))
+                  .append(tbody)
+                  .append($("<tfoot />").append($("<tr />").append($("<td />", {
+                    "colspan": "5",
+                    "class": "border-right border-left"
+                  })))));
+
+    for (var i = 0; i < data.length; i++) {
+      action = data[i];
+
+      row = $("<tr />");
+      if (i % 2) {
+        row.addClass("odd");
+      }
+      if (action.action == "DELETE") {
+        row.addClass("delete");
+      }
+      else {
+        row.addClass("with-context-menu");
+        row.attr("file_version", action.version);
+        row.attr("file_hash", action.update.hash);
+        row.attr("file_seg_num", action.update.segNum);
+        row.attr("file_modified_by", action.id.userName);
+      }
+
+      row.attr("filename", action.filename);
+
+      self = this;
+      if (PARAMS.item != action.filename) {
+        row.bind('click', function(e) {
+          openHistoryForItem($(this).attr("filename"))
+        });
+      }
+      else {
+        row.bind('click', function(e) {
+          self.previewFile($(this));
+        });
+      }
+
+      row.bind('mouseenter mouseleave', function() {
+        $(this).toggleClass('highlighted');
+      });
+
+      row.append(
+        $("<td />", {"class": "filename border-left"})
+          .text(action.filename)
+          .prepend($("<img />",
+                     {"src": imgFullPath(fileExtension(action.filename))})));
+      row.append($("<td />", {"class": "version"}).text(action.version));
+      row.append(
+        $("<td />", {
+          "class": "size"
+        }).text(action.update ? SegNumToFileSize(action.update.segNum) : ""));
+      row.append($("<td />", {
+                   "class": "timestamp"
+                 }).text(new Date(action.timestamp + "+00:00"))); // conversion
+                                                                  // from UTC
+      // timezone (we
+      // store action
+      // time in UTC)
+      row.append($("<td />", {"class": "modified-by border-right"})
+                   .append($("<userName />").text(action.id.userName))
+                   .append($("<seqNo> /").text(action.id.seqNo)));
+
+      tbody = tbody.append(row);
+    }
+
+    displayContent(newcontent, more, this.base_url(PAGE));
+
+    self = this;
+    $.contextMenu('destroy', ".with-context-menu"); // cleanup
+    $.contextMenu({
+      selector: ".with-context-menu",
+      items: {
+        "sep1": "---------",
+        preview: {
+          name: "Preview revision",
+          icon: "edit", // ned a better icon
+          callback: function(key, opt) {
+            self.previewFile(opt.$trigger);
+          }
+        },
+        "sep3": "---------",
+        restore: {
+          name: "Restore this revision",
+          icon: "cut", // need a better icon
+          callback: function(key, opt) {
+            filename = opt.$trigger.attr("filename");
+            version = opt.$trigger.attr("file_version");
+            hash = DataUtils.toNumbers(opt.$trigger.attr("file_hash"));
+            console.log(hash);
+            modified_by = opt.$trigger.attr("file_modified_by");
+
+            $("<div />", {"title": "Restore version " + version + "?"})
+              .append(
+                $("<p />").append($("<span />", {
+                                    "class": "ui-icon ui-icon-alert",
+                                    "style": "float: left; margin: 0 7px 50px 0;"
+                                  }),
+                                  $(document.createTextNode(
+                                    "Are you sure you want restore version ")),
+                                  $("<green/>").text(version),
+                                  $(document.createTextNode(" by ")),
+                                  $("<green/>").text(modified_by)))
+              .dialog({
+                resizable: true,
+                height: 200,
+                width: 300,
+                modal: true,
+                show: "blind",
+                hide: "fold",
+                buttons: {
+                  "Restore": function() {
+                    self = $(this);
+                    CHRONOSHARE.cmd_restore_file(filename, version, hash,
+                                                 function(didGetData, response) {
+                                                   if (!didGetData ||
+                                                       response != "OK") {
+                                                     custom_alert(response);
+                                                   }
+                                                   console.log(response);
+                                                   self.dialog("close");
+
+                                                   $.timer(function() {
+                                                      CHRONOSHARE.run();
+                                                    })
+                                                     .once(1000);
+                                                 });
+                  },
+                  Cancel: function() {
+                    $(this).dialog("close");
+                  }
+                }
+              });
+            // openHistoryForItem (opt.$trigger.attr ("filename"));
+          }
+        },
+        "sep2": "---------",
+      }
+    });
+  },
+
+  base_no_item_url: function(page) {
+    url = "#" + page + "&user=" +
+          encodeURIComponent(encodeURIComponent(PARAMS.user)) + "&folder=" +
+          encodeURIComponent(encodeURIComponent(PARAMS.folder));
+    return url;
+  },
+
+  base_url: function(page) {
+    url = "#" + page + "&user=" +
+          encodeURIComponent(encodeURIComponent(PARAMS.user)) + "&folder=" +
+          encodeURIComponent(encodeURIComponent(PARAMS.folder));
+    if (PARAMS.item !== undefined) {
+      url += "&item=" + encodeURIComponent(encodeURIComponent(PARAMS.item));
+    }
+    return url;
+  }
 });
-
-
-
-
diff --git a/gui/html/content.js b/gui/html/content.js
index 5042478..9a98648 100644
--- a/gui/html/content.js
+++ b/gui/html/content.js
@@ -1,77 +1,87 @@
-function prefix() {
-	var tmp = document.getElementById("prefixcontent").innerHTML;
-	var data = tmp.split("END");
-	var odd = "odd";
+function prefix()
+{
+  var tmp = document.getElementById("prefixcontent").innerHTML;
+  var data = tmp.split("END");
+  var odd = "odd";
 
-	for (var i in data) {
-    		// Parse the JSON data.
-    		var obj = jQuery.parseJSON(data[i]);
+  for (var i in data) {
+    // Parse the JSON data.
+    var obj = jQuery.parseJSON(data[i]);
 
-    		if (i % 2 == 0) {
-        		odd = "";
-    		} else {
-        		odd = "odd";
-		}
+    if (i % 2 == 0) {
+      odd = "";
+    }
+    else {
+      odd = "odd";
+    }
 
-    		// Create the HTML for each prefix.
-    		var output = '<tr class="' + odd + '">\n';
+    // Create the HTML for each prefix.
+    var output = '<tr class="' + odd + '">\n';
 
-    		output += '<td rowspan="' + obj.prefixes.length + '">' + obj.router + '</td>';
+    output +=
+      '<td rowspan="' + obj.prefixes.length + '">' + obj.router + '</td>';
 
 
-    		for (var i in obj.prefixes) {
-        		output += '<td class="' + odd + '">' + obj.prefixes[i].timestamp + '</td>';
-        		output += '<td class="' + odd + '">' + obj.prefixes[i].prefix + '</td>';
-			
-			if (obj.prefixes[i].status == "notintopology") {
-				output += '<td id="' + obj.prefixes[i].status + '">NPT</td>';
-			} else {
-        			output += '<td id="' + obj.prefixes[i].status + '">' + obj.prefixes[i].status + '</td>';
-        		}
-			
-			output += '</tr>';
-    		}
+    for (var i in obj.prefixes) {
+      output += '<td class="' + odd + '">' + obj.prefixes[i].timestamp + '</td>';
+      output += '<td class="' + odd + '">' + obj.prefixes[i].prefix + '</td>';
 
-    		// Append the data to the prefix table.
-    		$('.one > tbody:last').append(output);
-	}
+      if (obj.prefixes[i].status == "notintopology") {
+        output += '<td id="' + obj.prefixes[i].status + '">NPT</td>';
+      }
+      else {
+        output += '<td id="' + obj.prefixes[i].status + '">' +
+                  obj.prefixes[i].status + '</td>';
+      }
+
+      output += '</tr>';
+    }
+
+    // Append the data to the prefix table.
+    $('.one > tbody:last').append(output);
+  }
 }
 
-function link() {
-	var tmp = document.getElementById("linkcontent").innerHTML;
-        var data = tmp.split("END");
-	var odd = "odd";
+function link()
+{
+  var tmp = document.getElementById("linkcontent").innerHTML;
+  var data = tmp.split("END");
+  var odd = "odd";
 
-	for (var i in data) {
-    		// Parse the JSON data.
-    		var obj = jQuery.parseJSON(data[i]);
+  for (var i in data) {
+    // Parse the JSON data.
+    var obj = jQuery.parseJSON(data[i]);
 
-    		if (i % 2 == 0) {
-        		odd = "";
-    		} else {
-        		odd = "odd";
-		}
-	
-    		// Create the HTML for each prefix.
-    		var output = '<tr class="' + odd + '">\n';
+    if (i % 2 == 0) {
+      odd = "";
+    }
+    else {
+      odd = "odd";
+    }
 
-    		output += '<td rowspan="' + obj.links.length + '">' + obj.router + '</td>';
-    		output += '<td rowspan="' + obj.links.length + '">' + obj.timestamp + '</td>';
+    // Create the HTML for each prefix.
+    var output = '<tr class="' + odd + '">\n';
 
-    		for (var i in obj.links) {
-        		output += '<td id="' + obj.links[i].status + '">' + obj.links[i].link + '</td>';
+    output += '<td rowspan="' + obj.links.length + '">' + obj.router + '</td>';
+    output +=
+      '<td rowspan="' + obj.links.length + '">' + obj.timestamp + '</td>';
 
-			if (obj.links[i].status == "notintopology") {
-        			output += '<td id="' + obj.links[i].status + '">NPT</td>';
-			} else {
-				output += '<td id="' + obj.links[i].status + '">' + obj.links[i].status + '</td>';
-			}
+    for (var i in obj.links) {
+      output +=
+        '<td id="' + obj.links[i].status + '">' + obj.links[i].link + '</td>';
 
-        		output += '</tr>';
-    		}
+      if (obj.links[i].status == "notintopology") {
+        output += '<td id="' + obj.links[i].status + '">NPT</td>';
+      }
+      else {
+        output += '<td id="' + obj.links[i].status + '">' +
+                  obj.links[i].status + '</td>';
+      }
 
-    		// Append the data to the prefix table.
-    		$('.two > tbody:last').append(output);
-	}
+      output += '</tr>';
+    }
+
+    // Append the data to the prefix table.
+    $('.two > tbody:last').append(output);
+  }
 }
-
diff --git a/gui/html/detect.js b/gui/html/detect.js
index f5f0f64..48a15fc 100644
--- a/gui/html/detect.js
+++ b/gui/html/detect.js
@@ -1,60 +1,66 @@
-function detect() {
+function detect()
+{
+  var nVer = navigator.appVersion;
+  var nAgt = navigator.userAgent;
+  var browserName = navigator.appName;
+  var fullVersion = '' + parseFloat(navigator.appVersion);
+  var majorVersion = parseInt(navigator.appVersion, 10);
+  var nameOffset, verOffset, ix;
 
-    var nVer = navigator.appVersion;
-    var nAgt = navigator.userAgent;
-    var browserName = navigator.appName;
-    var fullVersion = '' + parseFloat(navigator.appVersion);
-    var majorVersion = parseInt(navigator.appVersion, 10);
-    var nameOffset, verOffset, ix;
+  // In Opera, the true version is after "Opera" or after "Version"
+  if ((verOffset = nAgt.indexOf("Opera")) != -1) {
+    browserName = "Opera";
+    fullVersion = nAgt.substring(verOffset + 6);
+    if ((verOffset = nAgt.indexOf("Version")) != -1)
+      fullVersion = nAgt.substring(verOffset + 8);
+  }
+  // In MSIE, the true version is after "MSIE" in userAgent
+  else if ((verOffset = nAgt.indexOf("MSIE")) != -1) {
+    browserName = "Microsoft Internet Explorer";
+    fullVersion = nAgt.substring(verOffset + 5);
+  }
+  // In Chrome, the true version is after "Chrome"
+  else if ((verOffset = nAgt.indexOf("Chrome")) != -1) {
+    browserName = "Chrome";
+    fullVersion = nAgt.substring(verOffset + 7);
+  }
+  // In Safari, the true version is after "Safari" or after "Version"
+  else if ((verOffset = nAgt.indexOf("Safari")) != -1) {
+    browserName = "Safari";
+    fullVersion = nAgt.substring(verOffset + 7);
+    if ((verOffset = nAgt.indexOf("Version")) != -1)
+      fullVersion = nAgt.substring(verOffset + 8);
+  }
+  // In Firefox, the true version is after "Firefox"
+  else if ((verOffset = nAgt.indexOf("Firefox")) != -1) {
+    browserName = "Firefox";
+    fullVersion = nAgt.substring(verOffset + 8);
+  }
+  // In most other browsers, "name/version" is at the end of userAgent
+  else if ((nameOffset = nAgt.lastIndexOf(' ') + 1) <
+           (verOffset = nAgt.lastIndexOf('/'))) {
+    browserName = nAgt.substring(nameOffset, verOffset);
+    fullVersion = nAgt.substring(verOffset + 1);
+    if (browserName.toLowerCase() == browserName.toUpperCase()) {
+      browserName = navigator.appName;
+    }
+  }
+  // trim the fullVersion string at semicolon/space if present
+  if ((ix = fullVersion.indexOf(";")) != -1)
+    fullVersion = fullVersion.substring(0, ix);
+  if ((ix = fullVersion.indexOf(" ")) != -1)
+    fullVersion = fullVersion.substring(0, ix);
 
-    // In Opera, the true version is after "Opera" or after "Version"
-    if ((verOffset = nAgt.indexOf("Opera")) != -1) {
-        browserName = "Opera";
-        fullVersion = nAgt.substring(verOffset + 6);
-        if ((verOffset = nAgt.indexOf("Version")) != -1) fullVersion = nAgt.substring(verOffset + 8);
-    }
-    // In MSIE, the true version is after "MSIE" in userAgent
-    else if ((verOffset = nAgt.indexOf("MSIE")) != -1) {
-        browserName = "Microsoft Internet Explorer";
-        fullVersion = nAgt.substring(verOffset + 5);
-    }
-    // In Chrome, the true version is after "Chrome"
-    else if ((verOffset = nAgt.indexOf("Chrome")) != -1) {
-        browserName = "Chrome";
-        fullVersion = nAgt.substring(verOffset + 7);
-    }
-    // In Safari, the true version is after "Safari" or after "Version"
-    else if ((verOffset = nAgt.indexOf("Safari")) != -1) {
-        browserName = "Safari";
-        fullVersion = nAgt.substring(verOffset + 7);
-        if ((verOffset = nAgt.indexOf("Version")) != -1) fullVersion = nAgt.substring(verOffset + 8);
-    }
-    // In Firefox, the true version is after "Firefox"
-    else if ((verOffset = nAgt.indexOf("Firefox")) != -1) {
-        browserName = "Firefox";
-        fullVersion = nAgt.substring(verOffset + 8);
-    }
-    // In most other browsers, "name/version" is at the end of userAgent
-    else if ((nameOffset = nAgt.lastIndexOf(' ') + 1) < (verOffset = nAgt.lastIndexOf('/'))) {
-        browserName = nAgt.substring(nameOffset, verOffset);
-        fullVersion = nAgt.substring(verOffset + 1);
-        if (browserName.toLowerCase() == browserName.toUpperCase()) {
-            browserName = navigator.appName;
-        }
-    }
-    // trim the fullVersion string at semicolon/space if present
-    if ((ix = fullVersion.indexOf(";")) != -1) fullVersion = fullVersion.substring(0, ix);
-    if ((ix = fullVersion.indexOf(" ")) != -1) fullVersion = fullVersion.substring(0, ix);
+  majorVersion = parseInt('' + fullVersion, 10);
+  if (isNaN(majorVersion)) {
+    fullVersion = '' + parseFloat(navigator.appVersion);
+    majorVersion = parseInt(navigator.appVersion, 10);
+  }
 
-    majorVersion = parseInt('' + fullVersion, 10);
-    if (isNaN(majorVersion)) {
-        fullVersion = '' + parseFloat(navigator.appVersion);
-        majorVersion = parseInt(navigator.appVersion, 10);
-    }
-
-    if (browserName == "Safari" && fullVersion == "5.1.7") {
-	return false;
-    } else {
-	return true;
-    }
+  if (browserName == "Safari" && fullVersion == "5.1.7") {
+    return false;
+  }
+  else {
+    return true;
+  }
 }
diff --git a/gui/main.cpp b/gui/main.cpp
index eab8e1a..29246e5 100644
--- a/gui/main.cpp
+++ b/gui/main.cpp
@@ -22,9 +22,10 @@
 #include "logging.hpp"
 #include <QApplication>
 
-int main(int argc, char *argv[])
+int
+main(int argc, char* argv[])
 {
-  INIT_LOGGERS ();
+  INIT_LOGGERS();
 
   QApplication app(argc, argv);
 
