diff --git a/CHANGELOG.txt b/CHANGELOG.txt
index 82459d2..ecac797 100644
--- a/CHANGELOG.txt
+++ b/CHANGELOG.txt
@@ -1,6 +1,11 @@
 X-editable changelog
 =============================
 
+Version 1.4.6 wip
+----------------------------
+[bug #276] support id() and text() functions of select2 (vitalets)
+
+
 Version 1.4.5 Jun 23, 2013
 ----------------------------
 [enh #245] highlight element after update (vitalets)
diff --git a/src/editable-form/editable-form-utils.js b/src/editable-form/editable-form-utils.js
index 2c9457d..69ef2c7 100644
--- a/src/editable-form/editable-form-utils.js
+++ b/src/editable-form/editable-form-utils.js
@@ -139,7 +139,10 @@
                return [];
            }
            
-           valueProp = valueProp || 'value';
+           if (typeof(valueProp) !== "function") {
+               var idKey = valueProp || 'value';
+               valueProp = function (e) { return e[idKey]; };
+           }
                       
            var isValArray = $.isArray(value),
            result = [], 
@@ -151,11 +154,11 @@
                } else {
                    /*jslint eqeq: true*/
                    if(isValArray) {
-                       if($.grep(value, function(v){  return v == (o && typeof o === 'object' ? o[valueProp] : o); }).length) {
+                       if($.grep(value, function(v){  return v == (o && typeof o === 'object' ? valueProp(o) : o); }).length) {
                            result.push(o); 
                        }
                    } else {
-                       if(value == (o && typeof o === 'object' ? o[valueProp] : o)) {
+                       if(value == (o && typeof o === 'object' ? valueProp(o) : o)) {
                            result.push(o); 
                        }
                    }
diff --git a/src/inputs/select2/select2.js b/src/inputs/select2/select2.js
index 8865c63..3ddaa2b 100644
--- a/src/inputs/select2/select2.js
+++ b/src/inputs/select2/select2.js
@@ -83,7 +83,7 @@ $(function(){
         
         //detect whether it is multi-valued
         this.isMultiple = this.options.select2.tags || this.options.select2.multiple;
-        this.isRemote = ('ajax' in this.options.select2);         
+        this.isRemote = ('ajax' in this.options.select2);
     };
 
     $.fn.editableutils.inherit(Constructor, $.fn.editabletypes.abstractinput);
@@ -108,16 +108,21 @@ $(function(){
                this.$input.on('change', function() {
                    $(this).closest('form').parent().triggerHandler('resize');
                }); 
-            } 
+            }
+            
+            //store function that extracs ID from element
+            this.idFunc = this.$input.data('select2').opts.id; 
+            this.formatSelection = this.$input.data('select2').opts.formatSelection; 
        },
        
        value2html: function(value, element) {
-           var text = '', data;
+           var text = '', data,
+               that = this;
            
            if(this.options.select2.tags) { //in tags mode just assign value
               data = value; 
            } else if(this.sourceData) {
-              data = $.fn.editableutils.itemsByValue(value, this.sourceData, 'id'); 
+              data = $.fn.editableutils.itemsByValue(value, this.sourceData, this.idFunc); 
            } else {
               //can not get list of possible values (e.g. autotext for select2 with ajax source) 
            }
@@ -127,10 +132,10 @@ $(function(){
                //collect selected data and show with separator
                text = [];
                $.each(data, function(k, v){
-                   text.push(v && typeof v === 'object' ? v.text : v); 
+                   text.push(v && typeof v === 'object' ? that.formatSelection(v) : v); 
                });                   
            } else if(data) {
-               text = data.text;  
+               text = that.formatSelection(data);  
            }
 
            text = $.isArray(text) ? text.join(this.options.viewseparator) : text;
@@ -149,7 +154,7 @@ $(function(){
                var item, items;
                //if sourceData loaded, use it to get text for display
                if(this.sourceData) {
-                   items = $.fn.editableutils.itemsByValue(value, this.sourceData, 'id');
+                   items = $.fn.editableutils.itemsByValue(value, this.sourceData, this.idFunc);
                    if(items.length) {
                        item = items[0];
                    }