diff --git a/apps/contacts/js/contacts.js b/apps/contacts/js/contacts.js
index dd194db016164ea676bf754cd8a0d5ce3c3072c6..b0274201ac970e0a4f2d2f87290439deea75dd54 100644
--- a/apps/contacts/js/contacts.js
+++ b/apps/contacts/js/contacts.js
@@ -258,7 +258,7 @@ Contacts={
 			$('#contacts_deletecard').tipsy({gravity: 'ne'});
 			$('#contacts_downloadcard').tipsy({gravity: 'ne'});
 			$('#contacts_propertymenu_button').tipsy();
-			$('#contacts_newcontact, #chooseaddressbook').tipsy({gravity: 'sw'});
+			$('#contacts_newcontact, #contacts_import, #chooseaddressbook').tipsy({gravity: 'sw'});
 
 			$('body').click(function(e){
 				if(!$(e.target).is('#contacts_propertymenu_button')) {
@@ -441,13 +441,13 @@ Contacts={
 								var newid = '', bookid;
 								var curlistitem = $('#contacts li[data-id="'+jsondata.data.id+'"]');
 								var newlistitem = curlistitem.prev('li');
-								if(newlistitem == undefined) {
+								if(!newlistitem) {
 									newlistitem = curlistitem.next('li');
 								}
 								curlistitem.remove();
-								if(!$(newlistitem).is('li')) {
+								if($(newlistitem).is('li')) {
 									newid = newlistitem.data('id');
-									bookid = newlistitem.data('id');
+									bookid = newlistitem.data('bookid');
 								}
 								$('#rightcontent').data('id',newid);
 								this.id = this.fn = this.fullname = this.shortname = this.famname = this.givname = this.addname = this.honpre = this.honsuf = '';
@@ -774,6 +774,7 @@ Contacts={
 				}
 			},
 			deleteProperty:function(obj, type){
+				console.log('deleteProperty');
 				Contacts.UI.loading(obj, true);
 				var checksum = Contacts.UI.checksumFor(obj);
 				if(checksum) {
@@ -1377,6 +1378,21 @@ Contacts={
 					}
 				  });
 			},
+			addAddressbook:function(name, description, cb) {
+				$.post(OC.filePath('contacts', 'ajax', 'addaddressbook.php'), { name: name, description: description, active: true },
+					function(jsondata){
+						if(jsondata.status == 'success'){
+							if(cb) {
+								cb(jsondata.data);
+							}
+							//Contacts.UI.Contacts.update();
+						} else {
+							OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
+							return false;
+						}
+				});
+
+			},
 			newAddressbook:function(object){
 				var tr = $(document.createElement('tr'))
 					.load(OC.filePath('contacts', 'ajax', 'addbook.php'));
@@ -1508,25 +1524,24 @@ Contacts={
 					.load(OC.filePath('contacts', 'ajax', 'importaddressbook.php'));
 				$(object).closest('tr').after(tr).hide();
 			},
-			doImport:function(path, file){
-				$(Contacts.UI.Addressbooks.droptarget).html(t('contacts', 'Importing...'));
-				Contacts.UI.loading(Contacts.UI.Addressbooks.droptarget, true);
-				var id = $('#importaddressbook_dialog').find('#book').val();
-				$.post(OC.filePath('contacts', '', 'import.php'), { id: id, path: path, file: file, fstype: 'OC_FilesystemView' },
-					function(jsondata){
-						if(jsondata.status == 'success'){
-							Contacts.UI.Addressbooks.droptarget.html(t('contacts', 'Import done. Success/Failure: ')+jsondata.data.imported+'/'+jsondata.data.failed);
-							$('#chooseaddressbook_dialog').find('#close_button').val(t('contacts', 'OK'));
-							Contacts.UI.Contacts.update();
-							setTimeout(
-									function() {
-										$(Contacts.UI.Addressbooks.droptarget).html(Contacts.UI.Addressbooks.droptext);
-									}, 5000);
-						} else {
-							OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
-						}
-				});
-				Contacts.UI.loading(Contacts.UI.Addressbooks.droptarget, false);
+			doImport:function(name, file, aid){
+				var cImport = function(id, file) {
+					$.post(OC.filePath('contacts', '', 'import.php'), { id: id, file: file, fstype: 'OC_FilesystemView' },
+						function(jsondata){
+							if(jsondata.status == 'success'){
+								Contacts.UI.Contacts.update(undefined, id);
+							} else {
+								OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
+							}
+					});
+				}
+				if(!aid) {
+					aid = Contacts.UI.Addressbooks.addAddressbook(name, t('contacts', 'Imported address book'), function(addressbook) {
+						cImport(addressbook.id, file);
+					});
+				} else {
+					cImport(aid, file);
+				}
 			},
 			submit:function(button, bookid){
 				var displayname = $("#displayname_"+bookid).val().trim();
@@ -1591,6 +1606,13 @@ Contacts={
 			},
 			// Reload the contacts list.
 			update:function(id, aid, start){
+				if(!start) {
+					if(aid) {
+						$('#contacts h3[data-id="'+aid+'"],#contacts ul[data-id="'+aid+'"]').remove();
+					} else {
+						$('#contacts').empty();
+					}
+				}
 				self = this;
 				console.log('update: ' + aid + ' ' + start);
 				var firstrun = false;
@@ -1605,12 +1627,12 @@ Contacts={
 						$.each(jsondata.data.entries, function(b, book) { 
 							if($('#contacts h3[data-id="'+b+'"]').length == 0) {
 								firstrun = true;
-								
+								// TODO: Make sure address books are sorted properly.
 								if($('#contacts h3').length == 0) {
-									$('#contacts').html('<h3 class="addressbook" data-id="'+b+'">'+book.displayname+'</h3><ul class="contacts hidden" data-id="'+b+'"></ul>');
+									$('#contacts').html('<h3 class="addressbook" contextmenu="addressbookmenu" data-id="'+b+'">'+book.displayname+'</h3><ul class="contacts hidden" data-id="'+b+'"></ul>');
 								} else {
 									if(!$('#contacts h3[data-id="'+b+'"]').length) {
-										$('<h3 class="addressbook" data-id="'+b+'">'+book.displayname+'</h3><ul class="contacts hidden" data-id="'+b+'"></ul>')
+										$('<h3 class="addressbook" contextmenu="addressbookmenu" data-id="'+b+'">'+book.displayname+'</h3><ul class="contacts hidden" data-id="'+b+'"></ul>')
 										.appendTo('#contacts');
 									}
 								}
@@ -1800,6 +1822,135 @@ $(document).ready(function(){
 		xhr.send(file);
 	}
 
+	// Import using jquery.fileupload
+	$(function() {
+		$('#contacts_import').click(function() {
+			$('#import_upload_start').click();
+			return false;
+		});
+		$('#import_upload_start').fileupload({
+			dropZone: $('#contacts'), // restrict dropZone to content div
+			add: function(e, data) {
+				var files = data.files;
+				var totalSize=0;
+				if(files){
+					for(var i=0;i<files.length;i++){
+						if(files[i].size ==0 && files[i].type== '')
+						{
+							OC.dialogs.alert(t('files', 'Unable to upload your file as it is a directory or has 0 bytes'), t('files', 'Upload Error'));
+							return;
+						}
+						totalSize+=files[i].size;
+					}
+				}
+				if(totalSize>$('#max_upload').val()){
+					console.log('upload too large');
+				}else{
+					if($.support.xhrFileUpload) {
+						// TODO: First upload file(s) and cache names in an array, then check if we know
+						// the aid, otherwise ask user, then import files.
+						for(var i=0;i<files.length;i++){
+							var fileName = files[i].name;
+							var dropTarget;
+							if($(e.originalEvent.target).is('h3')) {
+								console.log('h3');
+								dropTarget = $(e.originalEvent.target).next('ul');
+							} else {
+								dropTarget = $(e.originalEvent.target).closest('ul');
+							}
+							if(dropTarget && dropTarget.hasClass('contacts')) { // TODO: More thorough check for where we are.
+								var aid = dropTarget.attr('data-id');
+								console.log('aid: ' + aid);
+								var jqXHR =  $('#import_upload_start').fileupload('send', {files: files[i],
+										formData: function(form) {
+											console.log(form.html());
+											var formArray = form.serializeArray();
+											formArray['aid'] = aid;
+											return formArray;
+										}}).success(function(result, textStatus, jqXHR) {
+											if(result.status == 'success') {
+												// import the file
+												Contacts.UI.Addressbooks.doImport(result.data.name, result.data.file, aid);
+											} else {
+												console.log('Error: ' + response.data.message);
+											}
+										})
+								.error(function(jqXHR, textStatus, errorThrown) {
+									console.log(errorThrown, textStatus);
+									if(errorThrown === 'abort') {
+										console.log('abort');
+									}
+								});
+							} else {
+								var jqXHR =  $('#import_upload_start').fileupload('send', {files: files[i]})
+									.success(function(result, textStatus, jqXHR) {
+										if(result.status == 'success') {
+											// import the file
+											Contacts.UI.Addressbooks.doImport(result.data.name, result.data.file);
+										} else {
+											console.log('Error: ' + response.data.message);
+										}
+									})
+									.error(function(jqXHR, textStatus, errorThrown) {
+										console.log(jqXHR.responseText, errorThrown, textStatus);
+										if(errorThrown === 'abort') {
+										}
+									});
+							}
+						}
+					}else{
+						data.submit().success(function(data, status) {
+							response = jQuery.parseJSON(data[0].body.innerText);
+							if(response[0] != undefined && response[0].status == 'success') {
+								var file=response[0];
+								delete uploadingFiles[file.name];
+								$('tr').filterAttr('data-file',file.name).data('mime',file.mime);
+								var size = $('tr').filterAttr('data-file',file.name).find('td.filesize').text();
+								if(size==t('files','Pending')){
+									$('tr').filterAttr('data-file',file.name).find('td.filesize').text(file.size);
+								}
+								FileList.loadingDone(file.name);
+							} else {
+								$('#notification').text(t('files', response.data.message));
+								$('#notification').fadeIn();
+								$('#fileList > tr').not('[data-mime]').fadeOut();
+								$('#fileList > tr').not('[data-mime]').remove();
+							}
+						});
+					}
+				}
+			},
+			fail: function(e, data) {
+				console.log('fail');
+				// TODO: cancel upload & display error notification
+			},
+			progress: function(e, data) {
+				// TODO: show nice progress bar in file row
+			},
+			progressall: function(e, data) {
+				var progress = (data.loaded/data.total)*100;
+				console.log('progress: ' + progress);
+				$('#uploadprogressbar').progressbar('value',progress);
+			},
+			start: function(e, data) {
+				console.log('start');
+				$('#uploadprogressbar').progressbar({value:0});
+				$('#uploadprogressbar').fadeIn();
+				if(data.dataType != 'iframe ') {
+					$('#upload input.stop').show();
+				}
+			},
+			stop: function(e, data) {
+				console.log('stop');
+				if(data.dataType != 'iframe ') {
+					$('#upload input.stop').hide();
+				}	
+				$('#uploadprogressbar').progressbar('value',100);
+				$('#uploadprogressbar').fadeOut();
+			}
+		})
+	});
+	
 	Contacts.UI.loadHandlers();
 	Contacts.UI.Contacts.update(id);
 });