Index: wp-includes/js/mce-view.js
===================================================================
--- wp-includes/js/mce-view.js	(revision 22487)
+++ wp-includes/js/mce-view.js	(working copy)
@@ -236,7 +236,7 @@
 		// To render the views, call `wp.mce.view.render( scope )`.
 		toViews: function( content ) {
 			var pieces = [ { content: content } ],
-				current;
+				current, string = '';
 
 			_.each( views, function( view, viewType ) {
 				current = pieces.slice();
@@ -254,7 +254,7 @@
 
 					// Iterate through the string progressively matching views
 					// and slicing the string as we go.
-					while ( remaining && (result = view.toView( remaining )) ) {
+					while ( remaining && ( result = view.toView( remaining ) ) ) {
 						// Any text before the match becomes an unprocessed piece.
 						if ( result.index )
 							pieces.push({ content: remaining.substring( 0, result.index ) });
@@ -276,7 +276,30 @@
 				});
 			});
 
-			return _.pluck( pieces, 'content' ).join('');
+			// Put the content back together.
+			// Add padding before and after a view to allow the caret to go there.
+			_.each( pieces, function( piece ) {
+				if ( piece.processed ) {
+					// Pad before a view if it's first or the current string doesn't end with a space
+					if ( ! (/[ \uFEFF]$/).test(string) )
+						string += '\uFEFF '
+
+					string += piece.content;
+					return;
+				}
+
+				// Pad after a view if the current piece doesn't begin with a space
+				if ( string && ! (/^[ \uFEFF]/).test(piece.content) )
+					string += ' \uFEFF';
+
+				string += piece.content;
+			});
+			
+			// Last bit is a view, pad the end
+			if ( pieces[ pieces.length - 1 ].processed )
+				string += ' \uFEFF';
+
+			return string;
 		},
 
 		toView: function( viewType, options ) {
@@ -300,10 +323,9 @@
 			// called in the view's `render` method without a conditional.
 			instance.$wrapper = $();
 
+			// todo: remove "tag" from options
 			return wp.html.string({
-				// If the view is a span, wrap it in a span.
-				tag: 'span' === instance.tagName ? 'span' : 'div',
-
+				tag: 'span',
 				attrs: {
 					'class':           'wp-view-wrap wp-view-type-' + viewType,
 					'data-wp-view':    id,
@@ -344,7 +366,7 @@
 		// Scans an HTML `content` string and replaces any view instances with
 		// their respective text representations.
 		toText: function( content ) {
-			return content.replace( /<(?:div|span)[^>]+data-wp-view="([^"]+)"[^>]*>.*?<span[^>]+data-wp-view-end[^>]*><\/span><\/(?:div|span)>/g, function( match, id ) {
+			return content.replace( /(?:\uFEFF )?<span[^>]+?data-wp-view="([^"]+)"[^>]*>.*?<span[^>]+data-wp-view-end[^>]*><\/span><\/span>(?: \uFEFF)?/g, function( match, id ) {
 				var instance = instances[ id ],
 					view;
 
@@ -721,4 +743,4 @@
 			}
 		}
 	});
-}(jQuery));
\ No newline at end of file
+}(jQuery));
Index: wp-includes/js/tinymce/themes/advanced/skins/wp_theme/content.css
===================================================================
--- wp-includes/js/tinymce/themes/advanced/skins/wp_theme/content.css	(revision 22487)
+++ wp-includes/js/tinymce/themes/advanced/skins/wp_theme/content.css	(working copy)
@@ -161,10 +161,6 @@
 	box-shadow: none;
 }
 
-.wp-view-wrap.alignnone {
-	display: block;
-}
-
 .wp-view-wrap.aligncenter {
 	display: block;
 	text-align: center;
@@ -264,8 +260,6 @@
 .editor-attachment {
 	display: inline-block;
 	position: relative;
-	margin-top: 10px;
-	margin-right: 10px;
 	overflow: hidden;
 }
 
@@ -285,7 +279,7 @@
 }
 
 .wp-view-type-gallery {
-	display: block;
+	width: 99%;
 }
 
 .editor-gallery {
