Index: /CKEditor/trunk/_source/core/dom/range.js
===================================================================
--- /CKEditor/trunk/_source/core/dom/range.js	(revision 3732)
+++ /CKEditor/trunk/_source/core/dom/range.js	(revision 3733)
@@ -704,8 +704,9 @@
 		trim : function( ignoreStart, ignoreEnd )
 		{
-			var startContainer = this.startContainer;
-			var startOffset = this.startOffset;
-
-			if ( !ignoreStart && startContainer && startContainer.type == CKEDITOR.NODE_TEXT )
+			var startContainer = this.startContainer,
+				startOffset = this.startOffset,
+				collapsed = this.collapsed;
+			if ( ( !ignoreStart || collapsed )
+				 && startContainer && startContainer.type == CKEDITOR.NODE_TEXT )
 			{
 				// If the offset is zero, we just insert the new node before
@@ -731,13 +732,13 @@
 					startOffset = startContainer.getIndex() + 1;
 					startContainer = startContainer.getParent();
-
 					// Check if it is necessary to update the end boundary.
-					if ( this.collapsed )
-						this.setEnd( startContainer, startOffset );
-					else if ( this.startContainer.equals( this.endContainer ) )
+					if ( !collapsed && this.startContainer.equals( this.endContainer ) )
 						this.setEnd( nextText, this.endOffset - this.startOffset );
 				}
 
 				this.setStart( startContainer, startOffset );
+
+				if ( collapsed )
+					this.collapse( true );
 			}
 
@@ -745,5 +746,6 @@
 			var endOffset = this.endOffset;
 
-			if ( !ignoreEnd && endContainer && !this.collapsed && endContainer.type == CKEDITOR.NODE_TEXT )
+			if ( !( ignoreEnd || collapsed )
+				 && endContainer && endContainer.type == CKEDITOR.NODE_TEXT )
 			{
 				// If the offset is zero, we just insert the new node before
Index: /CKEditor/trunk/_source/tests/core/dom/range.html
===================================================================
--- /CKEditor/trunk/_source/tests/core/dom/range.html	(revision 3732)
+++ /CKEditor/trunk/_source/tests/core/dom/range.html	(revision 3733)
@@ -2189,4 +2189,47 @@
 		},
 
+		/**
+		 * Trim range which collapsed at text node boundary.
+		 */
+		test_trim_3790 : function()
+		{
+
+			var ct = doc.getById( '_trim_ct');
+			ct.setHtml( '<span id="_SPAN1">text</span>' );
+			var text = doc.getById( '_trim_ct').getFirst();
+
+			// <span id="_SPAN1">text^</span>
+			var range = new CKEDITOR.dom.range();
+			range.setStartAt( doc.getById( '_SPAN1' ).getFirst(), CKEDITOR.POSITION_BEFORE_END );
+			range.collapse( true );
+			range.trim( true );
+
+			// <span id="_SPAN1">text^</span>
+			assert.isTrue( range.collapsed );
+			assert.areEqual( doc.getById( '_SPAN1').$, range.startContainer.$ );
+			assert.areEqual( range.startOffset, 1 );
+		},
+
+		/**
+		 * Trim range which collapsed inside text node.
+		 */
+		test_trim_3790_2 : function()
+		{
+
+			var ct = doc.getById( '_trim_ct');
+			ct.setHtml( '<span id="_SPAN1">text</span>' );
+			var text = doc.getById( '_trim_ct').getFirst();
+
+			// <span id="_SPAN1">te^xt</span>
+			var range = new CKEDITOR.dom.range();
+			range.setStart( doc.getById( '_SPAN1' ).getFirst(), 2 );
+			range.collapse( true );
+			range.trim( true );
+
+			// <span id="_SPAN1">te^xt</span>
+			assert.isTrue( range.collapsed );
+			assert.areEqual( doc.getById( '_SPAN1').$, range.startContainer.$ );
+			assert.areEqual( range.startOffset, 1 );
+		},
 		/////////////
 
@@ -2201,9 +2244,5 @@
 })() );
 
-//window.onload = function()
-//{
-//	tests.test_createBookmark2_3();
-//}
-
+//window.onload = tests.test_trim;
 	//]]>
 	</script>
