SelfProfile related things is done, not tested yet.
diff --git a/src/profileeditor.cpp b/src/profileeditor.cpp
new file mode 100644
index 0000000..9b75f50
--- /dev/null
+++ b/src/profileeditor.cpp
@@ -0,0 +1,104 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2013, Regents of the University of California
+ *                     Yingdi Yu
+ *
+ * BSD license, See the LICENSE file for more information
+ *
+ * Author: Yingdi Yu <yingdi@cs.ucla.edu>
+ */
+
+#include "profileeditor.h"
+#include "ui_profileeditor.h"
+#include <QtSql/QSqlRecord>
+#include <QtSql/QSqlField>
+#include <QtSql/QSqlError>
+
+#ifndef Q_MOC_RUN
+#include "logging.h"
+#include "exception.h"
+#endif
+
+using namespace ndn;
+
+INIT_LOGGER("ProfileEditor");
+
+ProfileEditor::ProfileEditor(Ptr<ContactStorage> contactStorage, QWidget *parent) 
+    : QDialog(parent)
+    , ui(new Ui::ProfileEditor)
+    , m_tableModel(new QSqlTableModel())
+    , m_contactStorage(contactStorage)
+{
+    ui->setupUi(this);
+
+    connect(ui->addRowButton, SIGNAL(clicked()),
+            this, SLOT(onAddClicked()));
+    connect(ui->deleteRowButton, SIGNAL(clicked()),
+            this, SLOT(onDeleteClicked()));
+    connect(ui->okButton, SIGNAL(clicked()),
+            this, SLOT(onOkClicked()));
+    
+    m_tableModel->setEditStrategy(QSqlTableModel::OnManualSubmit);
+    m_tableModel->setTable("SelfProfile");
+    m_tableModel->select();
+    m_tableModel->setHeaderData(0, Qt::Horizontal, QObject::tr("Index"));
+    m_tableModel->setHeaderData(1, Qt::Horizontal, QObject::tr("Type"));
+    m_tableModel->setHeaderData(2, Qt::Horizontal, QObject::tr("Value"));
+
+    ui->profileTable->setModel(m_tableModel);
+    ui->profileTable->setColumnHidden(0, true);
+    ui->profileTable->show();
+
+}
+
+ProfileEditor::~ProfileEditor()
+{
+    delete ui;
+    delete m_tableModel;
+}
+
+void
+ProfileEditor::onAddClicked()
+{
+  int rowCount = m_tableModel->rowCount();
+
+  // QSqlRecord record;
+  // QSqlField typeField("profile_type", QVariant::String);
+  // QSqlField valueField("profile_value", QVariant::String);
+  // record.append(typeField);
+  // record.append(valueField);
+  // record.setValue("profile_type", QString("N/A"));
+  // record.setValue("profile_value", QString("N/A"));
+
+  // bool res = m_tableModel->insertRecord(-1, record);
+
+  // res = m_tableModel->submitAll();
+  m_tableModel->insertRow(rowCount);
+}
+
+void
+ProfileEditor::onDeleteClicked()
+{
+  QItemSelectionModel* selectionModel = ui->profileTable->selectionModel();
+  QModelIndexList indexList = selectionModel->selectedRows();
+
+  int i = indexList.size() - 1;  
+  for(; i >= 0; i--)
+    {
+      if(0 != indexList[i].row())
+        m_tableModel->removeRow(indexList[i].row());
+    }
+  m_tableModel->submitAll();
+}
+
+void
+ProfileEditor::onOkClicked()
+{
+  m_tableModel->submitAll();
+  this->hide();
+}
+
+#if WAF
+#include "profileeditor.moc"
+#include "profileeditor.cpp.moc"
+#endif