diff --git a/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/widget/L2SimpleEditingTest.java b/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/widget/L2SimpleEditingTest.java
index 4da09c2..409adf0 100644
--- a/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/widget/L2SimpleEditingTest.java
+++ b/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/widget/L2SimpleEditingTest.java
@@ -12,6 +12,7 @@
 package org.eclipse.vex.core.internal.widget;
 
 import static org.eclipse.vex.core.internal.widget.VexWidgetTest.PARA;
+import static org.eclipse.vex.core.internal.widget.VexWidgetTest.PRE;
 import static org.eclipse.vex.core.internal.widget.VexWidgetTest.TITLE;
 import static org.eclipse.vex.core.internal.widget.VexWidgetTest.createDocumentWithDTD;
 import static org.eclipse.vex.core.tests.TestResources.TEST_DTD;
@@ -24,7 +25,6 @@
 import java.io.IOException;
 import java.util.List;
 
-import org.eclipse.core.runtime.QualifiedName;
 import org.eclipse.vex.core.internal.css.CssWhitespacePolicy;
 import org.eclipse.vex.core.internal.css.StyleSheet;
 import org.eclipse.vex.core.internal.css.StyleSheetReader;
@@ -297,7 +297,7 @@
 		widget.setWhitespacePolicy(new CssWhitespacePolicy(widget.getStyleSheet()));
 		rootElement = widget.getDocument().getRootElement();
 
-		final IElement preElement = widget.insertElement(new QualifiedName(null, "pre"));
+		final IElement preElement = widget.insertElement(PRE);
 		assertEquals(preElement.getEndOffset(), widget.getCaretOffset());
 		widget.insertText("line1");
 		widget.insertText("\n");
@@ -351,7 +351,7 @@
 	public void givenPreElement_whenInsertingTextWithNewline_shouldInsertNewline() throws Exception {
 		widget.setDocument(createDocumentWithDTD(TEST_DTD, "para"), readTestStyleSheet());
 		widget.setWhitespacePolicy(new CssWhitespacePolicy(widget.getStyleSheet()));
-		final IElement preElement = widget.insertElement(new QualifiedName(null, "pre"));
+		final IElement preElement = widget.insertElement(PRE);
 		assertEquals(preElement.getEndOffset(), widget.getCaretOffset());
 		widget.insertText("line1\nline2");
 		assertEquals("line1\nline2", preElement.getText());
@@ -361,7 +361,7 @@
 	public void givenPreElement_whenInsertingText_shouldKeepWhitespace() throws Exception {
 		widget.setDocument(createDocumentWithDTD(TEST_DTD, "para"), readTestStyleSheet());
 		widget.setWhitespacePolicy(new CssWhitespacePolicy(widget.getStyleSheet()));
-		final IElement preElement = widget.insertElement(new QualifiedName(null, "pre"));
+		final IElement preElement = widget.insertElement(PRE);
 
 		widget.moveTo(preElement.getEndOffset());
 		widget.insertText("line1\nline2   end");
@@ -380,7 +380,7 @@
 		widget.insertText("line1\nline2   \t end");
 
 		final List<? extends INode> children = widget.getDocument().getRootElement().children().after(para.getStartOffset()).asList();
-		assertEquals("single para element", 2, children.size());
+		assertEquals("two para elements", 2, children.size());
 		assertTrue("original para element", children.get(0) instanceof IParent);
 		assertTrue("splitted para element", children.get(1) instanceof IParent);
 		assertEquals("first line", "line1", children.get(0).getText());
@@ -396,13 +396,56 @@
 		widget.insertText("line1\n\nline2");
 
 		final List<? extends INode> children = widget.getDocument().getRootElement().children().after(para.getStartOffset()).asList();
-		assertEquals("single para element", 2, children.size());
+		assertEquals("two para elements", 2, children.size());
 		assertTrue("original para element", children.get(0) instanceof IParent);
 		assertTrue("splitted para element", children.get(1) instanceof IParent);
 		assertEquals("first line", "line1", children.get(0).getText());
 		assertEquals("second line", "line2", children.get(1).getText());
 	}
 
+	@Test
+	public void givenNonPreElement_whenSplitting_shouldSplitIntoTwoElements() throws Exception {
+		widget.setDocument(createDocumentWithDTD(TEST_DTD, "section"), readTestStyleSheet());
+		widget.setWhitespacePolicy(new CssWhitespacePolicy(widget.getStyleSheet()));
+		final IElement para = widget.insertElement(PARA);
+		widget.moveTo(para.getEndOffset());
+		widget.insertText("line1line2");
+		widget.moveBy(-5);
+
+		widget.split();
+
+		final List<? extends INode> children = widget.getDocument().getRootElement().children().after(para.getStartOffset()).asList();
+		assertEquals("two para elements", 2, children.size());
+		assertTrue("original para element", children.get(0) instanceof IParent);
+		assertTrue("splitted para element", children.get(1) instanceof IParent);
+		assertEquals("first line element", PARA, ((IElement) children.get(0)).getQualifiedName());
+		assertEquals("second line element", PARA, ((IElement) children.get(0)).getQualifiedName());
+		assertEquals("first line", "line1", children.get(0).getText());
+		assertEquals("second line", "line2", children.get(1).getText());
+	}
+
+	@Test
+	public void givenPreElement_whenSplitting_shouldSplitIntoTwoElements() throws Exception {
+		widget.setDocument(createDocumentWithDTD(TEST_DTD, "para"), readTestStyleSheet());
+		widget.setWhitespacePolicy(new CssWhitespacePolicy(widget.getStyleSheet()));
+		final IElement preElement = widget.insertElement(PRE);
+		widget.moveTo(preElement.getEndOffset());
+		widget.insertText("line1line2");
+		widget.moveBy(-5);
+
+		widget.split();
+
+		final List<? extends INode> children = widget.getDocument().getRootElement().children().after(preElement.getStartOffset()).asList();
+		assertEquals("two para elements", 2, children.size());
+		assertTrue("original pre element", children.get(0) instanceof IParent);
+		assertTrue("splitted pre element", children.get(1) instanceof IParent);
+		assertEquals("first line element", PRE, ((IElement) children.get(0)).getQualifiedName());
+		assertEquals("second line element", PRE, ((IElement) children.get(0)).getQualifiedName());
+		assertEquals("first line", "line1", children.get(0).getText());
+		assertEquals("second line", "line2", children.get(1).getText());
+
+	}
+
 	private static StyleSheet readTestStyleSheet() throws IOException {
 		return new StyleSheetReader().read(TestResources.get("test.css"));
 	}
diff --git a/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/widget/VexWidgetTest.java b/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/widget/VexWidgetTest.java
index 0ebc2c5..f5b51e7 100644
--- a/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/widget/VexWidgetTest.java
+++ b/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/widget/VexWidgetTest.java
@@ -34,6 +34,7 @@
 
 	public static final QualifiedName TITLE = new QualifiedName(null, "title");
 	public static final QualifiedName PARA = new QualifiedName(null, "para");
+	public static final QualifiedName PRE = new QualifiedName(null, "pre");
 
 	private IVexWidget widget;
 
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/widget/BaseVexWidget.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/widget/BaseVexWidget.java
index 090e203..606b337 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/widget/BaseVexWidget.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/widget/BaseVexWidget.java
@@ -848,7 +848,7 @@
 		final IElement element = document.getElementForInsertionAt(getCaretOffset());
 		final boolean isPreformatted = whitespacePolicy.isPre(element);
 
-		String toInsert;
+		final String toInsert;
 		if (!isPreformatted) {
 			toInsert = XML.compressWhitespace(XML.normalizeNewlines(text), true, true, true);
 		} else {
@@ -868,7 +868,12 @@
 					applyEdit(new InsertTextEdit(document, getCaretOffset(), toInsert.substring(i, nextLineBreak)), getCaretOffset());
 				}
 				this.moveTo(getCaretOffset() + nextLineBreak - i);
-				split();
+				if (isPreformatted) {
+					applyEdit(new InsertTextEdit(document, getCaretOffset(), "\n"), getCaretOffset());
+					moveBy(1);
+				} else {
+					split();
+				}
 				i = nextLineBreak + 1;
 			}
 
@@ -1486,35 +1491,29 @@
 		final long start = System.currentTimeMillis();
 
 		final IElement element = getBlockForInsertionAt(getCaretOffset());
-		final boolean isPreformatted = whitespacePolicy.isPre(element);
 
 		boolean success = false;
 		try {
 			beginWork();
-			if (isPreformatted) {
-				applyEdit(new InsertTextEdit(document, getCaretOffset(), "\n"), getCaretOffset());
-				this.moveBy(1);
-			} else {
-				IDocumentFragment frag = null;
-				int offset = getCaretOffset();
-				final boolean atEnd = offset == element.getEndOffset();
-				if (!atEnd) {
-					this.moveTo(element.getEndOffset(), true);
-					frag = getSelectedFragment();
-					deleteSelection();
-				}
+			IDocumentFragment frag = null;
+			int offset = getCaretOffset();
+			final boolean atEnd = offset == element.getEndOffset();
+			if (!atEnd) {
+				this.moveTo(element.getEndOffset(), true);
+				frag = getSelectedFragment();
+				deleteSelection();
+			}
 
-				// either way, we are now at the end offset for the element, let's move just outside
-				this.moveBy(1);
+			// either way, we are now at the end offset for the element, let's move just outside
+			this.moveBy(1);
 
-				insertElement(element.getQualifiedName());
-				// TODO: clone attributes
+			insertElement(element.getQualifiedName());
+			// TODO: clone attributes
 
-				if (!atEnd) {
-					offset = getCaretOffset();
-					insertFragment(frag);
-					this.moveTo(offset, false);
-				}
+			if (!atEnd) {
+				offset = getCaretOffset();
+				insertFragment(frag);
+				this.moveTo(offset, false);
 			}
 			success = true;
 		} finally {
