diff --git a/apps/contacts/ajax/saveproperty.php b/apps/contacts/ajax/saveproperty.php
index 3a50d18e6a6bfef8a947f37deadec1e538b67c60..0769791ea3654962e75e7419d43225e5ee633110 100644
--- a/apps/contacts/ajax/saveproperty.php
+++ b/apps/contacts/ajax/saveproperty.php
@@ -128,14 +128,8 @@ switch($element) {
 $checksum = md5($vcard->children[$line]->serialize());
 debug('New checksum: '.$checksum);
 
-<<<<<<< HEAD
-if(!OC_Contacts_VCard::edit($id,$vcard->serialize())) {
-	bailOut(OC_Contacts_App::$l10n->t('Error updating contact property.'));
-=======
 if(!OC_Contacts_VCard::edit($id,$vcard)) {
-	OC_JSON::error(array('data' => array('message' => OC_Contacts_App::$l10n->t('Error updating contact property.'))));
-	OC_Log::write('contacts','ajax/setproperty.php: Error updating contact property: '.$value, OC_Log::ERROR);
->>>>>>> d8cfe77ba5348d29a9e2b046e2c7efc1dd4758cb
+	bailOut(OC_Contacts_App::$l10n->t('Error updating contact property.'));
 	exit();
 }
 
diff --git a/apps/contacts/index.php b/apps/contacts/index.php
index a7817d35e586bc62113a75718cc7e41d3a6b3d7d..48b2b8b4f019ac9709ad28fd32b279c2814b36e6 100644
--- a/apps/contacts/index.php
+++ b/apps/contacts/index.php
@@ -49,6 +49,7 @@ OC_Util::addScript('contacts','contacts');
 OC_Util::addScript('contacts','jquery.combobox');
 OC_Util::addScript('contacts','jquery.inview');
 OC_Util::addScript('contacts','jquery.Jcrop');
+OC_Util::addScript('contacts','jquery.multi-autocomplete');
 OC_Util::addStyle('','jquery.multiselect');
 //OC_Util::addStyle('contacts','styles');
 OC_Util::addStyle('contacts','jquery.combobox');
@@ -59,6 +60,7 @@ $tmpl = new OC_Template( "contacts", "index", "user" );
 $tmpl->assign('uploadMaxFilesize', $maxUploadFilesize);
 $tmpl->assign('uploadMaxHumanFilesize', OC_Helper::humanFileSize($maxUploadFilesize));
 $tmpl->assign('property_types',$property_types);
+$tmpl->assign('categories',OC_Contacts_App::getCategories());
 $tmpl->assign('phone_types',$phone_types);
 $tmpl->assign('categories',$categories);
 $tmpl->assign('addressbooks', $addressbooks);
diff --git a/apps/contacts/js/contacts.js b/apps/contacts/js/contacts.js
index 483d2a228d1989e4a1bb371ef4a5e418d9769260..5f6129ca6542188e4faa27d443ab6ab23b16292a 100644
--- a/apps/contacts/js/contacts.js
+++ b/apps/contacts/js/contacts.js
@@ -252,12 +252,12 @@ Contacts={
 			$('#bday').datepicker({
 						dateFormat : 'dd-mm-yy'
 			});
-			$('#categories_value').find('select').multiselect({
+			/*$('#categories_value').find('select').multiselect({
 										noneSelectedText: t('contacts', 'Select categories'),
 										header: false,
 										selectedList: 6,
 										classes: 'categories'
-									});
+									});*/
 			// Style phone types
 			$('#phonelist').find('select.contacts_property').multiselect({
 													noneSelectedText: t('contacts', 'Select type'),
@@ -299,6 +299,7 @@ Contacts={
 					click: function() { $(this).dialog('close'); }
 				}
 			] );
+			$('#categories').multiple_autocomplete({source: categories});
 			Contacts.UI.loadListHandlers();
 		},
 		Card:{
@@ -439,7 +440,7 @@ Contacts={
 				$('#rightcontent').data('id',this.id);
 				console.log('loaded: ' + this.data.FN[0]['value']);
 				this.populateNameFields();
-				this.loadCategories();
+				//this.loadCategories();
 				this.loadPhoto();
 				this.loadMails();
 				this.loadPhones();
@@ -457,7 +458,7 @@ Contacts={
 				}
 			},
 			loadSingleProperties:function() {
-				var props = ['BDAY', 'NICKNAME', 'ORG'];
+				var props = ['BDAY', 'NICKNAME', 'ORG', 'CATEGORIES'];
 				// Clear all elements
 				$('#ident .propertycontainer').each(function(){
 					if(props.indexOf($(this).data('element')) > -1) {
@@ -493,6 +494,12 @@ Contacts={
 								$('#contact_identity').find('#org_label').show();
 								$('#contact_identity').find('#org_value').show();
 								break;
+							case 'CATEGORIES':
+								$('#contact_identity').find('#categories').val(value);
+								$('#contact_identity').find('#categories_value').data('checksum', checksum);
+								$('#contact_identity').find('#categories_label').show();
+								$('#contact_identity').find('#categories_value').show();
+								break;
 						}
 					} else {
 						$('#contacts_propertymenu a[data-type="'+props[prop]+'"]').parent().show();
@@ -740,6 +747,7 @@ Contacts={
 					case 'NICKNAME':
 					case 'ORG':
 					case 'BDAY':
+					case 'CATEGORIES':
 						$('dl dt[data-element="'+type+'"],dd[data-element="'+type+'"]').show();
 						$('#contacts_propertymenu a[data-type="'+type+'"]').parent().hide();
 						break;
diff --git a/apps/contacts/js/jquery.multi-autocomplete.js b/apps/contacts/js/jquery.multi-autocomplete.js
new file mode 100644
index 0000000000000000000000000000000000000000..4be8d901c96076c02e84989bbe3bebc30246db78
--- /dev/null
+++ b/apps/contacts/js/jquery.multi-autocomplete.js
@@ -0,0 +1,47 @@
+/**
+ * Inspired by http://jqueryui.com/demos/autocomplete/#multiple
+ */
+
+(function( $ ) {
+	$.widget('ui.multiple_autocomplete', {
+		_create: function() {
+			function split( val ) {
+				return val.split( /,\s*/ );
+			}
+			function extractLast( term ) {
+				return split( term ).pop();
+			}
+			//console.log('_create: ' + this.options['id']);
+			var self = this;
+			this.element.bind( "keydown", function( event ) {
+				if ( event.keyCode === $.ui.keyCode.TAB &&
+						$( this ).data( "autocomplete" ).menu.active ) {
+					event.preventDefault();
+				}
+			})
+			.autocomplete({
+				minLength: 0,
+				source: function( request, response ) {
+					// delegate back to autocomplete, but extract the last term
+					response( $.ui.autocomplete.filter(
+						self.options.source, extractLast( request.term ) ) );
+				},
+				focus: function() {
+					// prevent value inserted on focus
+					return false;
+				},
+				select: function( event, ui ) {
+					var terms = split( this.value );
+					// remove the current input
+					terms.pop();
+					// add the selected item
+					terms.push( ui.item.value );
+					// add placeholder to get the comma-and-space at the end
+					terms.push( "" );
+					this.value = terms.join( ", " );
+					return false;
+				}
+			});
+		},
+	});
+})( jQuery );
diff --git a/apps/contacts/lib/app.php b/apps/contacts/lib/app.php
index 1fa441475d2ec76aff1b37c2a64fdeeee7319fea..cc33c733007247cb5d1448b2984f694b50e851cd 100644
--- a/apps/contacts/lib/app.php
+++ b/apps/contacts/lib/app.php
@@ -155,6 +155,10 @@ class OC_Contacts_App {
 		}
 	}
 
+	public static function getCategories() {
+		return self::$categories->categories();
+	}
+
 	public static function setLastModifiedHeader($contact) {
 		$rev = $contact->getAsString('REV');
 		if ($rev) {
diff --git a/apps/contacts/lib/vcard.php b/apps/contacts/lib/vcard.php
index 50370370898bd12bf8ff831b43942efe5b2e0dd1..a7e1817d7c8302ae69e3f1c5afa43596d7552d8f 100644
--- a/apps/contacts/lib/vcard.php
+++ b/apps/contacts/lib/vcard.php
@@ -306,6 +306,8 @@ class OC_Contacts_VCard{
 			return false;
 		}
 
+		OC_Contacts_App::$categories->loadFromVObject($card);
+
 		$fn = $card->getAsString('FN');
 		if (empty($fn)) {
 			$fn = null;
diff --git a/apps/contacts/templates/index.php b/apps/contacts/templates/index.php
index e81597f23d6df00680360e38b9c6b78d8b625173..efd797e25cb3d8d23bc3496c50ac58fdaa4fcdd6 100644
--- a/apps/contacts/templates/index.php
+++ b/apps/contacts/templates/index.php
@@ -1,5 +1,6 @@
 <script type='text/javascript'>
 	var totalurl = '<?php echo OC_Helper::linkToAbsolute('contacts', 'carddav.php'); ?>/addressbooks';
+	var categories = <?php echo json_encode($_['categories']); ?>;
 </script>
 <div id="controls">
 	<form>
diff --git a/apps/contacts/templates/part.contact.php b/apps/contacts/templates/part.contact.php
index 59bb6c2cc2911cd3141b8775424527b090a85ffc..115458470baf2e59fb117acee961c35ec2a810f7 100644
--- a/apps/contacts/templates/part.contact.php
+++ b/apps/contacts/templates/part.contact.php
@@ -14,6 +14,7 @@ $id = isset($_['id']) ? $_['id'] : '';
 		<li><a data-type="EMAIL"><?php echo $l->t('Email'); ?></a></li>
 		<li><a data-type="ADR"><?php echo $l->t('Address'); ?></a></li>
 		<li><a data-type="NOTE"><?php echo $l->t('Note'); ?></a></li>
+		<li><a data-type="CATEGORIES"><?php echo $l->t('Categories'); ?></a></li>
 	</ul>
 	</div>
 	<img  onclick="Contacts.UI.Card.export();" class="svg action" id="contacts_downloadcard" src="<?php echo image_path('', 'actions/download.svg'); ?>" title="<?php echo $l->t('Download contact');?>" />
@@ -54,13 +55,15 @@ $id = isset($_['id']) ? $_['id'] : '';
 		<dd style="display:none;" class="propertycontainer" id="nickname_value" data-element="NICKNAME"><input id="nickname" required="required" name="value[NICKNAME]" type="text" class="contacts_property" style="width:16em;" name="value" value="" placeholder="<?php echo $l->t('Enter nickname'); ?>" /><a class="delete" onclick="$(this).tipsy('hide');Contacts.UI.Card.deleteProperty(this, 'single');" title="<?php echo $l->t('Delete'); ?>"></a></dd>
 		<dt style="display:none;" id="bday_label" data-element="BDAY"><label for="bday"><?php echo $l->t('Birthday'); ?></label></dt>
 		<dd style="display:none;" class="propertycontainer" id="bday_value" data-element="BDAY"><input id="bday"  required="required" name="value" type="text" class="contacts_property" value="" placeholder="<?php echo $l->t('dd-mm-yyyy'); ?>" /><a class="delete" onclick="$(this).tipsy('hide');Contacts.UI.Card.deleteProperty(this, 'single');" title="<?php echo $l->t('Delete'); ?>"></a></dd>
-		<dt id="categories_label" data-element="CATEGORIES"><label for="categories"><?php echo $l->t('Categories'); ?></label></dt>
+		<!-- dt id="categories_label" data-element="CATEGORIES"><label for="categories"><?php echo $l->t('Categories'); ?></label></dt>
 		<dd class="propertycontainer" id="categories_value" data-element="CATEGORIES">
 			<select class="contacts_property" multiple="multiple" id="categories" name="value[]">
 				<?php echo html_select_options($_['categories'], array(), array('combine'=>true)) ?>
 			</select>
 			<a class="action edit" onclick="$(this).tipsy('hide');Categories.edit();" title="<?php echo $l->t('Edit categories'); ?>"></a>
-		</dd>
+		</dd -->
+		<dt style="display:none;" id="categories_label" data-element="CATEGORIES"><label for="categories"><?php echo $l->t('Categories'); ?></label></dt>
+		<dd style="display:none;" class="propertycontainer" id="categories_value" data-element="CATEGORIES"><input id="categories"  required="required" name="value[CATEGORIES]" type="text" class="contacts_property" style="width:16em;" name="value" value="" placeholder="<?php echo $l->t('Categories'); ?>" /><a class="delete" onclick="$(this).tipsy('hide');Contacts.UI.Card.deleteProperty(this, 'single');" title="<?php echo $l->t('Delete'); ?>"></a><a class="action edit" onclick="$(this).tipsy('hide');Categories.edit();" title="<?php echo $l->t('Edit categories'); ?>"></a></dd>
 	</dl>
 	</fieldset>
 	<fieldset id="note" class="formfloat propertycontainer" style="display:none;" data-element="NOTE">