diff --git a/Res/main.js b/Res/main.js
index d637842..851b3fd 100755
--- a/Res/main.js
+++ b/Res/main.js
@@ -173,25 +173,37 @@
   console.log("The contact, "+myContact.displayName + ", is of the "+myContact.gender +" gender");
 }
 
-function saveContact(contacts) {
-  var onSuccess = function() {
-    debugPrint("Save Success "+contacts);
-  };
-  var onError = function(contactError) {
-    debugPrint("Error = "+contactError.code);
-  };
-  var contact = navigator.service.contacts.create();
-  contact.displayName = "John";
-  contact.nickname = "Plumber";
-  contact.phoneNumbers = ["6047894567"]
-  contact.emails = ["nomail@noset.com"]
-  contact.urls = ["http://www.domain.com"]
-
-  var name = new ContactName();
-  name.givenName = "Jane";
-  name.familtyName = "Doe";
-  contact.name = name;
-  contact.save(onSuccess, onError);
+function saveContact() {
+  try {
+    var onSuccess = function(result) {
+      debugPrint("Save Success: "+result.message);
+    };
+    var onError = function(contactError) {
+      debugPrint("Error = "+contactError.code);
+    };
+    var contact = navigator.service.contacts.create();
+    contact.name = new ContactName();
+    contact.name.familyName = "Doe";
+    contact.name.givenName = "John";
+    contact.displayName = "John Doe";
+    contact.nickname = "Plumber";
+    contact.phoneNumbers = [new ContactField("Mobile", "6047894567"), new ContactField("Home", "7789989674"), new ContactField("Other", "7789989673")];
+    contact.emails = [new ContactField("Personal", "nomail@noset.com"), new ContactField("Work", "nomail2@noset.com"), new ContactField("Other", "nomail3@noset.com")];
+    contact.urls = [new ContactField("work", "http://www.domain.com"), new ContactField("home", "http://www.domain2.com")];
+    contact.organization = new ContactOrganization();
+    contact.organization.name = "Nitobi Software Inc";
+    contact.organization.title = "Software Engineer";
+    contact.birthday = new Date();
+    contact.address = new ContactAddress();
+    contact.address.streetAddress = "200 Abbott Street";
+    contact.address.locality = "Vancouver";
+    contact.address.region = "BC";
+    contact.address.postalCode = "V6Z2X6";
+    contact.address.country = "Canada";
+    contact.save(onSuccess, onError);
+  } catch(e) {
+    debugPrint("Error Occured: "+e.message);
+  }
 }
 
 // Compass
diff --git a/Res/phonegap/contact.js b/Res/phonegap/contact.js
index e29c54c..4f9c6e1 100644
--- a/Res/phonegap/contact.js
+++ b/Res/phonegap/contact.js
@@ -25,6 +25,7 @@
 * @param {ContactField[]} urls contact's web sites
 * @param {DOMString} timezone UTC time zone offset
 */
+
 var Contact = function(id, displayName, name, nickname, phoneNumbers, emails, addresses,
     ims, organizations, revision, birthday, gender, note, photos, categories, urls, timezone) {
     this.id = id || null;
@@ -173,8 +174,8 @@
 */
 Contact.prototype.save = function(successCB, errorCB) {
 	// don't modify the original contact
-  var bada_contact = {email: this.emails[0], phone: this.phoneNumbers[0], email: this.emails[0], url: this.urls[0]};
-	PhoneGap.exec(successCB, errorCB, "com.phonegap.Contacts", "save", [bada_contact]);
+  var id = navigator.service.contacts.records.push(this) - 1;
+	PhoneGap.exec(successCB, errorCB, "com.phonegap.Contacts", "save", [id]);
 };
 
 /**
diff --git a/inc/Contacts.h b/inc/Contacts.h
index 48592ab..c21272e 100755
--- a/inc/Contacts.h
+++ b/inc/Contacts.h
@@ -8,24 +8,32 @@
 #ifndef CONTACTS_H_
 #define CONTACTS_H_
 
-#include <FApp.h>
+#include <FSocial.h>
 #include "PhoneGapCommand.h"
+using namespace Osp::Social;
 using namespace Osp::Base::Collection;
-using namespace Osp::App;
 
-class Contacts: public PhoneGapCommand, IAppControlEventListener {
+class Contacts: public PhoneGapCommand {
 public:
 	Contacts(Web* pWeb);
 	virtual ~Contacts();
 public:
 	void Run(const String& command);
-	void Create(const String& query);
+	void Create(const int contactId);
 	void Find();
-public:
-	virtual void OnAppControlCompleted (const Osp::Base::String &appControlId, const Osp::Base::String &operationId, const Osp::Base::Collection::IList *pResultList);
 private:
-	ArrayList* GetDataList(const String& query);
 	String callbackId;
+private:
+	void SetNickname(Contact& contact, const int cid);
+	void SetFirstName(Contact& contact, const int cid);
+	void SetLastName(Contact& contact, const int cid);
+	void SetPhoneNumbers(Contact& contact, const int cid);
+	void SetEmails(Contact& contact, const int cid);
+	void SetUrls(Contact& contact, const int cid);
+	void SetOrganization(Contact& contact, const int cid);
+	void SetBirthday(Contact& contact, const int cid);
+	void SetAddress(Contact& contact, const int cid);
+
 };
 
 #endif /* CONTACTS_H_ */
diff --git a/src/Contacts.cpp b/src/Contacts.cpp
index d900af9..bb4ab26 100755
--- a/src/Contacts.cpp
+++ b/src/Contacts.cpp
@@ -8,77 +8,226 @@
 #include "../inc/Contacts.h"
 
 Contacts::Contacts(Web* pWeb) : PhoneGapCommand(pWeb) {
-	// TODO Auto-generated constructor stub
 
 }
 
 Contacts::~Contacts() {
-	// TODO Auto-generated destructor stub
 }
 
 void
 Contacts::Run(const String& command) {
 	if(!command.IsEmpty()) {
-		// URL decoding
 		Uri commandUri;
 		commandUri.SetUri(command);
 		String method = commandUri.GetHost();
-		callbackId = commandUri.GetPath();
-		callbackId.Replace(L"/", L"");
-		String contactInfo = commandUri.GetQuery();
-
-//		AppLogDebug("Method %S, callbackId %S, hostAddr %S URI %S", method.GetPointer(), callbackId.GetPointer(), hostAddr.GetPointer(), uri.ToString().GetPointer());
-		AppLogDebug("Method %S callbackId %S query %S", method.GetPointer(), callbackId.GetPointer() , contactInfo.GetPointer());
+		StringTokenizer strTok(commandUri.GetPath(), L"/");
+		if(strTok.GetTokenCount() < 2) {
+			AppLogException("Not enough params");
+			return;
+		}
+		strTok.GetNextToken(callbackId);
+		String contactId;
+		strTok.GetNextToken(contactId);
+		int cid = -1;
+		result r = E_SUCCESS;
+		r = Integer::Parse(contactId, cid);
+		if(IsFailed(r)) {
+			AppLogException("Could not retrieve contact ID");
+		}
+		AppLogDebug("Method %S callbackId %S contactId %d", method.GetPointer(), callbackId.GetPointer(), cid);
 		if(method == L"com.phonegap.Contacts.save" && !callbackId.IsEmpty()) {
-			Create(contactInfo);
+			AppLogDebug("Saving contact...");
+			Create(cid);
 		}
 
 	}
 }
 
-ArrayList*
-Contacts::GetDataList(const String& query) {
-	ArrayList* pDataList = new ArrayList();
-	pDataList->Construct();
-	String* pStorage = new String(L"storageType:phone");
-	pDataList->Add(*pStorage);
-
-	String delim(L"&");
-	StringTokenizer strTok(query, delim);
-
-	while(strTok.HasMoreTokens()) {
-		String* pData = new String();
-		strTok.GetNextToken(*pData);
-		pData->Replace(L"=", L":");
-		AppLogDebug("param %S", pData->GetPointer());
-		pDataList->Add(*pData);
+void
+Contacts::SetNickname(Contact& contact, const int cid) {
+	String* value = NULL;
+	String eval;
+	eval.Format(64, L"navigator.service.contacts.records[%d].nickname", cid);
+	value = pWeb->EvaluateJavascriptN(eval);
+	if(!value->IsEmpty()) {
+		AppLogDebug("nickname: %S", value->GetPointer());
+		contact.SetValue(CONTACT_PROPERTY_ID_NICK_NAME, *value);
 	}
-
-	return pDataList;
+	delete value;
 }
 
 void
-Contacts::OnAppControlCompleted(const Osp::Base::String &appControlId,
-								const Osp::Base::String &operationId,
-								const Osp::Base::Collection::IList *pResultList) {
-	AppLogDebug("appControlId %S operationId %S", appControlId.GetPointer(), operationId.GetPointer());
-	for(int i = 0 ; i < pResultList->GetCount() ; i++) {
-		String* obj = (String*)pResultList->GetAt(i);
-		AppLogDebug("OBJ %S", obj->GetPointer());
+Contacts::SetFirstName(Contact& contact, const int cid) {
+	String* value = NULL;
+	String eval;
+	eval.Format(64, L"navigator.service.contacts.records[%d].name.givenName", cid);
+	value = pWeb->EvaluateJavascriptN(eval);
+	if(!value->IsEmpty()) {
+		AppLogDebug("First Name: %S", value->GetPointer());
+		contact.SetValue(CONTACT_PROPERTY_ID_FIRST_NAME, *value);
+	}
+	delete value;
+}
+
+void
+Contacts::SetLastName(Contact& contact, const int cid) {
+	String* value = NULL;
+	String eval;
+	eval.Format(64, L"navigator.service.contacts.records[%d].name.familyName", cid);
+	value = pWeb->EvaluateJavascriptN(eval);
+	if(value->IsEmpty()) {
+		AppLogDebug("Last Name: %S", value->GetPointer());
+		contact.SetValue(CONTACT_PROPERTY_ID_LAST_NAME, *value);
+	}
+	delete value;
+}
+
+void
+Contacts::SetPhoneNumbers(Contact& contact, const int cid) {
+	// Getting phone numbers length
+	String* lengthStr = NULL;
+	String eval;
+	eval.Format(64, L"navigator.service.contacts.records[%d].phoneNumbers.length", cid);
+	lengthStr = pWeb->EvaluateJavascriptN(eval);
+	if(!lengthStr->IsEmpty()) {
+		int length;
+		result r = Integer::Parse(*lengthStr, length);
+		if(IsFailed(r)) {
+			AppLogException("Could not get phoneNumbers length");
+			return;
+		}
+		delete lengthStr;
+		for(int i = 0 ; i < length ; i++) {
+			String* type = NULL;
+			String* number = NULL;
+
+			// Getting phone number type
+			eval.Clear();
+			eval.Format(64, L"navigator.service.contacts.records[%d].phoneNumbers[%d].type", cid, i);
+			type = pWeb->EvaluateJavascriptN(eval);
+
+			// Getting phone number
+			eval.Clear();
+			eval.Format(64, L"navigator.service.contacts.records[%d].phoneNumbers[%d].value", cid, i);
+			number = pWeb->EvaluateJavascriptN(eval);
+
+			if(type != NULL && number != NULL) {
+				if(*type == PHONENUMBER_TYPE_HOME) {
+					PhoneNumber phoneNumber(PHONENUMBER_TYPE_HOME, *number);
+					contact.AddPhoneNumber(phoneNumber);
+				} else if(*type == PHONENUMBER_TYPE_MOBILE) {
+					PhoneNumber phoneNumber(PHONENUMBER_TYPE_MOBILE, *number);
+					contact.AddPhoneNumber(phoneNumber);
+				} else if(*type == PHONENUMBER_TYPE_PAGER) {
+					PhoneNumber phoneNumber(PHONENUMBER_TYPE_PAGER, *number);
+					contact.AddPhoneNumber(phoneNumber);
+				} else if(*type == PHONENUMBER_TYPE_WORK) {
+					PhoneNumber phoneNumber(PHONENUMBER_TYPE_WORK, *number);
+					contact.AddPhoneNumber(phoneNumber);
+				} else if(*type == PHONENUMBER_TYPE_OTHER) {
+					PhoneNumber phoneNumber(PHONENUMBER_TYPE_OTHER, *number);
+					contact.AddPhoneNumber(phoneNumber);
+				}
+			}
+			delete type;
+			delete number;
+		}
 	}
 }
 
 void
-Contacts::Create(const String& query) {
-	ArrayList* pDataList = GetDataList(query);
-	AppControl* pAc = AppManager::FindAppControlN(APPCONTROL_CONTACT,OPERATION_ADD);
-	if(pAc)
-	{
-		pAc->Start(pDataList, this);
-		delete pAc;
+Contacts::SetEmails(Contact& contact, const int cid) {
+	// Getting phone numbers length
+	String* lengthStr = NULL;
+	String eval;
+	eval.Format(64, L"navigator.service.contacts.records[%d].emails.length", cid);
+	lengthStr = pWeb->EvaluateJavascriptN(eval);
+	if(!lengthStr->IsEmpty()) {
+		int length;
+		result r = Integer::Parse(*lengthStr, length);
+		if(IsFailed(r)) {
+			AppLogException("Could not get emails length");
+			return;
+		}
+		delete lengthStr;
+		for(int i = 0 ; i < length ; i++) {
+			String* type = NULL;
+			String* address = NULL;
+
+			// Getting phone number type
+			eval.Clear();
+			eval.Format(64, L"navigator.service.contacts.records[%d].emails[%d].type", cid, i);
+			type = pWeb->EvaluateJavascriptN(eval);
+
+			// Getting phone number
+			eval.Clear();
+			eval.Format(64, L"navigator.service.contacts.records[%d].emails[%d].value", cid, i);
+			address = pWeb->EvaluateJavascriptN(eval);
+
+			if(type != NULL && address != NULL) {
+				if(*type == EMAIL_TYPE_PERSONAL) {
+			        Email email(EMAIL_TYPE_PERSONAL, *address);
+			        contact.AddEmail(email);
+				} else if(*type == EMAIL_TYPE_WORK) {
+			        Email email(EMAIL_TYPE_WORK, *address);
+			        contact.AddEmail(email);
+				} else if(*type == EMAIL_TYPE_OTHER) {
+			        Email email(EMAIL_TYPE_OTHER, *address);
+			        contact.AddEmail(email);
+				}
+			}
+			delete type;
+			delete address;
+		}
 	}
-	pDataList->RemoveAll(true);
-	delete pDataList;
+}
+
+void
+Contacts::SetUrls(Contact& contact, const int cid) {
+}
+
+void
+Contacts::SetOrganization(Contact& contact, const int cid) {
+
+}
+void
+Contacts::SetBirthday(Contact& contact, const int cid) {
+}
+
+void
+Contacts::SetAddress(Contact& contact, const int cid) {
+}
+
+void
+Contacts::Create(const int cid) {
+	result r = E_SUCCESS;
+	Addressbook addressbook;
+
+	r = addressbook.Construct();
+
+	if(IsFailed(r)) {
+		AppLogException("Could not create AddressBook");
+		return;
+	}
+
+	Contact contact;
+	SetNickname(contact, cid);
+	SetFirstName(contact, cid);
+	SetLastName(contact, cid);
+	SetPhoneNumbers(contact, cid);
+	SetEmails(contact, cid);
+	SetUrls(contact, cid);
+	SetOrganization(contact, cid);
+	SetBirthday(contact, cid);
+	SetAddress(contact, cid);
+
+	r = addressbook.AddContact(contact);
+
+	if(IsFailed(r)) {
+		AppLogException("Could not add contact");
+	} else {
+		AppLogDebug("Contact Successfully Added");
+	}
 }
 
 void
