diff --git a/grunt.js b/grunt.js
index c850a18..dd4f8ac 100644
--- a/grunt.js
+++ b/grunt.js
@@ -164,6 +164,7 @@ module.exports = function(grunt) {
               'src/inputs/date/*.js',
               'src/inputs/dateui/*.js',
               'src/inputs/combodate/*.js',
+              'src/inputs/select2/*.js',
               
               'src/inputs-ext/address/*.js',
               'src/inputs-ext/wysihtml5/*.js'
diff --git a/src/containers/editable-container.js b/src/containers/editable-container.js
index 322d2d7..6c88750 100644
--- a/src/containers/editable-container.js
+++ b/src/containers/editable-container.js
@@ -116,6 +116,7 @@ Applied as jQuery method.
                 cancel: $.proxy(function(){ this.hide('cancel'); }, this), //click on calcel button
                 show: $.proxy(this.setPosition, this), //re-position container every time form is shown (occurs each time after loading state)
                 rendering: $.proxy(this.setPosition, this), //this allows to place container correctly when loading shown
+                resize: $.proxy(this.setPosition, this), //this allows to re-position container when form size is changed 
                 rendered: $.proxy(function(){
                     /**        
                     Fired when container is shown and form is rendered (for select will wait for loading dropdown options)
diff --git a/src/editable-form/editable-form-utils.js b/src/editable-form/editable-form-utils.js
index 4eb6aee..2fc0044 100644
--- a/src/editable-form/editable-form-utils.js
+++ b/src/editable-form/editable-form-utils.js
@@ -132,10 +132,12 @@
        /*
         returns array items from sourceData having value property equal or inArray of 'value'
        */
-       itemsByValue: function(value, sourceData) {
+       itemsByValue: function(value, sourceData, valueProp) {
            if(!sourceData || value === null) {
                return [];
            }
+           
+           valueProp = valueProp || 'value';
                       
            var isValArray = $.isArray(value),
            result = [], 
@@ -147,11 +149,11 @@
                } else {
                    /*jslint eqeq: true*/
                    if(isValArray) {
-                       if($.grep(value, function(v){ return v == o.value; }).length) {
+                       if($.grep(value, function(v){  return v == (o && typeof o === 'object' ? o[valueProp] : o); }).length) {
                            result.push(o); 
                        }
                    } else {
-                       if(value == o.value) {
+                       if(value == (o && typeof o === 'object' ? o[valueProp] : o)) {
                            result.push(o); 
                        }
                    }
diff --git a/src/editable-form/editable-form.js b/src/editable-form/editable-form.js
index 3bff76d..64f8946 100644
--- a/src/editable-form/editable-form.js
+++ b/src/editable-form/editable-form.js
@@ -25,6 +25,7 @@ Editableform is linked with one of input types, e.g. 'text', 'select' etc.
             this.input = this.options.input;
             
             //set initial value
+            //todo: may be add check: typeof str === 'string' ? 
             this.value = this.input.str2value(this.options.value); 
         },
         initTemplate: function() {
diff --git a/src/inputs/select2/select2.js b/src/inputs/select2/select2.js
index 260d06d..b9d5479 100644
--- a/src/inputs/select2/select2.js
+++ b/src/inputs/select2/select2.js
@@ -26,22 +26,30 @@ $(function(){
     var Constructor = function (options) {
         this.init('select2', options, Constructor.defaults);
         
+        var mixin = {
+            placeholder:  options.placeholder
+        };
+        
+        if(options.select2 && options.select2.tags) {
+            
+        }
+       /*
+        if(!(options.select2 && options.select2.tags)) {
+            mixin.data = options.source; 
+            mixin.initSelection = function (element, callback) {
+                //see https://github.com/ivaynberg/select2/issues/710
+                var data = [];
+                $.each(this.data, function(k, v) {
+                    if(v.id ==  element.val()) {
+                        data.push(v);
+                    } 
+                });
+                callback(data);
+            }; 
+        }
+      */     
         //overriding objects in config (as by default jQuery extend() is not recursive)
-        this.options.select2 = $.extend({}, Constructor.defaults.select2, {
-            data:  options.source,
-            placeholder:  options.placeholder,
-            initSelection : function (element, callback) {
-                    //see https://github.com/ivaynberg/select2/issues/710
-                    var data; 
-                    $.each(this.data, function(k, v) {
-                       if(v.id ==  element.val()) {
-                           data = v;
-                           return false;
-                       } 
-                    });
-                    callback(data);
-            }            
-        }, options.select2);
+        this.options.select2 = $.extend({}, Constructor.defaults.select2, mixin, options.select2);
     };
 
     $.fn.editableutils.inherit(Constructor, $.fn.editabletypes.abstractinput);
@@ -51,16 +59,43 @@ $(function(){
             this.setClass();
             //apply select2
             this.$input.select2(this.options.select2);
+            
+            if(this.options.select2.tags) {
+               this.$input.on('change', function() {
+                   //trigger resize of editableform to re-position container
+                   $(this).closest('form').parent().triggerHandler('resize');
+               }); 
+            }            
+            
         },
        
        value2html: function(value, element) {
+           var text = '', data;
            if(this.$input) { //when submitting form 
-               $(element).text(this.$input.select2('data').text);
+               data = this.$input.select2('data');
            } else { //on init (autotext)
-               //todo: here select2 instance not created yet and data may be even not loaded.
-               //but we can check data property of select and if it exist find text
-               $(element).text('');
+               //here select2 instance not created yet and data may be even not loaded.
+               //but we can check data/tags property of select and if it exist lookup text
+               if(this.options.select2.tags) {
+                   data = value;
+               } else if(this.options.select2.data) {
+                   data = $.fn.editableutils.itemsByValue(value, this.options.select2.data, 'id');   
+               }
            }
+           
+           if($.isArray(data)) {
+               //collect selected data and show with separator
+               text = [];
+               $.each(data, function(k, v){
+                   text.push(v && typeof v === 'object' ? v.text : v); 
+               });                   
+           } else if(data) {
+               text = data.text;  
+           }
+
+           text = $.isArray(text) ? text.join(this.options.viewseparator) : text;
+           
+           $(element).text(text);
        },       
         
        html2value: function(html) {
@@ -68,14 +103,30 @@ $(function(){
        }, 
        
        value2input: function(value) {
-           this.$input.select2('val', value);
-//           this.$input.val(value);
+//           this.$input.val(value).select2('val', value);
+           this.$input.val(value).trigger('change');
        },
        
        input2value: function() { 
            return this.$input.select2('val');
 //           return this.$input.val();
-       }                       
+       },
+
+       str2value: function(str) {
+            if(typeof str !== 'string') {
+                return str;
+            }
+            var val, i, l,
+                separator = this.options.select2.separator || $.fn.select2.defaults.separator;
+            if (str === null || str.length < 1) {
+                return null;
+            }
+            val = str.split(separator);
+            for (i = 0, l = val.length; i < l; i = i + 1) {
+                val[i] = $.trim(val[i]);
+            }
+            return val;
+       }        
         
     });      
 
@@ -105,7 +156,15 @@ $(function(){
         Source data for select. It will be assigned to select2 `data` property and kept just for convenience.
         Please note, that format is different from simple `select` input.  
         **/
-        source: null        
+        source: null,
+        /**
+        Separator used to display tags. 
+        
+        @property viewseparator 
+        @type string
+        @default ', '        
+        **/
+        viewseparator: ', '        
     });
 
     $.fn.editabletypes.select2 = Constructor;