Index: src/main/resources/META-INF/resources/primefaces/forms/forms.css
===================================================================
--- src/main/resources/META-INF/resources/primefaces/forms/forms.css	(revision 12035)
+++ src/main/resources/META-INF/resources/primefaces/forms/forms.css	(working copy)
@@ -15,6 +15,15 @@
     resize:none;
 }
 
+.ui-inputtextarea-resizable-reference{
+    position: absolute;
+    bottom: 0;
+    right: 0;
+    white-space: pre-wrap;
+    word-wrap: break-word;
+    visibility: hidden;
+}
+
 .ui-selectonelistbox, 
 .ui-selectmanymenu,
 .ui-multiselectlistbox-listcontainer {
Index: src/main/resources/META-INF/resources/primefaces/forms/forms.js
===================================================================
--- src/main/resources/META-INF/resources/primefaces/forms/forms.js	(revision 12035)
+++ src/main/resources/META-INF/resources/primefaces/forms/forms.js	(working copy)
@@ -66,6 +66,19 @@
     },
 
     setupAutoResize: function() {
+        var suffix, referenceContainerId;
+
+        suffix = '_reference';
+        referenceContainerId = this.jqId + suffix;
+
+        this.referenceContainer = $(referenceContainerId);
+        if (this.referenceContainer.length != 1) {
+            this.referenceContainer = $(document.createElement('div'))
+											    .attr('id', this.id + suffix)
+											    .addClass('ui-widget ui-inputfield ui-inputtextarea ui-inputtextarea-resizable-reference')
+											    .appendTo($(document.body));
+        } 
+           	
         var _self = this;
 
         this.jq.keyup(function() {
@@ -78,16 +91,20 @@
     },
 
     resize: function() {
-        var linesCount = 0,
-        lines = this.jq.val().split('\n');
+        var newH, minH;
 
-        for(var i = lines.length-1; i >= 0 ; --i) {
-            linesCount += Math.floor((lines[i].length / this.cfg.colsDefault) + 1);
+        //Update reference container and resize text area
+        this.referenceContainer.width(this.jq.width());
+        this.referenceContainer.text(this.jq.val());
+
+        newH = this.referenceContainer.innerHeight();
+        minH = parseInt(this.jq.css('min-height'), 10); //parse to int to remove all non numeric chars
+
+        if(isNaN(minH) || minH === 0){
+            this.jq.css('min-height',this.jq.height());
         }
 
-        var newRows = (linesCount >= this.cfg.rowsDefault) ? (linesCount + 1) : this.cfg.rowsDefault;
-
-        this.jq.attr('rows', newRows);
+        this.jq.height(newH);
     },
 
     applyMaxlength: function() {
