diff --git a/r/org.eclipse.statet.r.core-tests/src/org/eclipse/statet/internal/r/core/sourcemodel/SyntaxProblemReporterTest.java b/r/org.eclipse.statet.r.core-tests/src/org/eclipse/statet/internal/r/core/sourcemodel/SyntaxProblemReporterTest.java
index f7b150d..b197e39 100644
--- a/r/org.eclipse.statet.r.core-tests/src/org/eclipse/statet/internal/r/core/sourcemodel/SyntaxProblemReporterTest.java
+++ b/r/org.eclipse.statet.r.core-tests/src/org/eclipse/statet/internal/r/core/sourcemodel/SyntaxProblemReporterTest.java
@@ -70,7 +70,7 @@
 		final RSourceUnit su= createSourceUnit(source);
 		final SourceContent sourceContent= su.getContent(new NullProgressMonitor());
 		final SourceComponent sourceComponent= this.rParser.scanSourceUnit(
-				new StringParserInput(sourceContent.getText()).init() );
+				new StringParserInput(sourceContent.getString()).init() );
 		final List<Problem> collectedProblems= new ArrayList<>();
 		this.problemReporter.run(su, sourceContent, sourceComponent, new ProblemRequestor() {
 			@Override
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/builder/RBuildReconciler.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/builder/RBuildReconciler.java
index 05d8c09..7c3ac38 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/builder/RBuildReconciler.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/builder/RBuildReconciler.java
@@ -24,8 +24,6 @@
 import org.eclipse.core.runtime.OperationCanceledException;
 import org.eclipse.core.runtime.Status;
 
-import org.eclipse.statet.jcommons.text.core.TextLineInformation;
-
 import org.eclipse.statet.internal.r.core.sourcemodel.RModelManagerImpl;
 import org.eclipse.statet.internal.r.core.sourcemodel.RReconciler;
 import org.eclipse.statet.r.core.RCore;
@@ -97,12 +95,10 @@
 //			problemRequestor.beginReportingSequence();
 			try {
 				final List<RAstNode> comments= ((SourceComponent) data.ast.getRoot()).getComments();
-				this.taskScanner.setup((IResource) su.getResource());
-				final TextLineInformation lines= data.content.getLines();
+				this.taskScanner.setup(data.content, (IResource)su.getResource());
 				for (final RAstNode comment : comments) {
-						final int offset= comment.getStartOffset() + 1;
-						this.taskScanner.checkForTasks(data.content.getText().substring(
-								offset, offset + comment.getLength() - 1 ), offset, lines );
+						this.taskScanner.checkForTasks(
+								comment.getStartOffset() + 1, comment.getEndOffset() );
 				}
 			}
 			catch (final Exception e) {
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/builder/RBuilder.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/builder/RBuilder.java
index 324c137..08cd2e0 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/builder/RBuilder.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/builder/RBuilder.java
@@ -50,6 +50,7 @@
 import org.eclipse.statet.ltk.buildpath.core.BuildpathElement;
 import org.eclipse.statet.ltk.buildpath.core.BuildpathUtils;
 import org.eclipse.statet.ltk.core.Ltk;
+import org.eclipse.statet.ltk.core.SourceContent;
 import org.eclipse.statet.ltk.model.core.LtkModels;
 import org.eclipse.statet.ltk.model.core.SourceUnitManager;
 import org.eclipse.statet.r.core.RBuildpaths;
@@ -453,8 +454,9 @@
 	
 	protected void doParseRd(final IFile file) throws CoreException {
 		try {
-			this.taskMarkerHandler.setup(file);
-			new RdParser(readFile(file), this.taskMarkerHandler).check();
+			final SourceContent sourceContent= new SourceContent(0, readFile(file));
+			this.taskMarkerHandler.setup(sourceContent, file);
+			new RdParser(sourceContent, this.taskMarkerHandler).check();
 		}
 		catch (final CoreException e) {
 			this.statusCollector.add(new Status(IStatus.ERROR, RCore.BUNDLE_ID, 0,
@@ -463,7 +465,7 @@
 		}
 	}
 	
-	protected char[] readFile(final IFile file) throws CoreException {
+	protected String readFile(final IFile file) throws CoreException {
 		String charset= null;
 		InputStream input= null;
 		try {
@@ -478,9 +480,7 @@
 				text.append(readBuffer, 0, n);
 			}
 			
-			final char[] chars= new char[text.length()];
-			text.getChars(0, chars.length, chars, 0);
-			return chars;
+			return text.toString();
 		}
 		catch (final UnsupportedEncodingException e) {
 			throw new CoreException(new Status(
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/builder/RdParser.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/builder/RdParser.java
index 457e167..08c74bd 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/builder/RdParser.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/builder/RdParser.java
@@ -17,109 +17,33 @@
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.jface.text.BadLocationException;
 
-import org.eclipse.statet.jcommons.collections.IntArrayList;
-import org.eclipse.statet.jcommons.collections.IntList;
-import org.eclipse.statet.jcommons.text.core.TextLineInformation;
-import org.eclipse.statet.jcommons.text.core.TextRegion;
-
-import org.eclipse.statet.ecommons.text.core.JFaceTextRegion;
+import org.eclipse.statet.ltk.core.SourceContent;
 
 
 public class RdParser {
 	
-	public class LineInformation implements TextLineInformation {
-		
-		
-		private final IntList offsets;
-		
-		
-		public LineInformation() {
-			this.offsets= new IntArrayList();
-		}
-		
-		public void addLine(final int offset) {
-			this.offsets.add(offset);
-		}
-		
-		@Override
-		public int getNumberOfLines() {
-			return this.offsets.size();
-		}
-		
-		@Override
-		public int getLineOfOffset(final int offset) {
-			if (this.offsets.size() == 0) {
-				return -1;
-			}
-			int low= 0;
-			int high= this.offsets.size() - 1;
-			
-			while (low <= high) {
-				final int mid= (low + high) >> 1;
-				final int lineOffset= this.offsets.getAt(mid);
-				
-				if (lineOffset < offset) {
-					low= mid + 1;
-				}
-				else if (lineOffset > offset) {
-					high= mid - 1;
-				}
-				else {
-					return mid;
-				}
-			}
-			return low - 1;
-		}
-		
-		@Override
-		public int getStartOffset(final int line) {
-			if (line < 0 || line >= this.offsets.size()) {
-				return -1;
-			}
-			return this.offsets.getAt(line);
-		}
-		
-		@Override
-		public int getEndOffset(final int line) {
-			return (line + 1 == this.offsets.size()) ? RdParser.this.content.length : this.offsets.getAt(line + 1);
-		}
-		
-		@Override
-		public int getLength(final int line) {
-			return (line + 1 == this.offsets.size()) ?
-					(RdParser.this.content.length - this.offsets.getAt(line)) :
-					(this.offsets.getAt(line + 1) - this.offsets.getAt(line) );
-		}
-		
-		@Override
-		public TextRegion getRegion(final int line) {
-			return JFaceTextRegion.newByStartEnd(this.offsets.getAt(line),
-					(line + 1 == this.offsets.size()) ?
-							RdParser.this.content.length :
-							this.offsets.getAt(line + 1) );
-		}
-		
-	}
-	
-	
-	private static final char[][] PLATFORM_KEYWORDS= {			// without '#'
-		"ifdef".toCharArray(), "ifndef".toCharArray(), "endif".toCharArray() }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+	private static final char[][] PLATFORM_KEYWORDS= { // without '#'
+		"ifdef".toCharArray(), //$NON-NLS-1$
+		"ifndef".toCharArray(), //$NON-NLS-1$
+		"endif".toCharArray() }; //$NON-NLS-1$
 	
 	private enum Last { NONE, NEWLINE, BACKSLASH }
 	
-	private final RTaskMarkerHandler markers;
+	
+	private final SourceContent sourceContent;
 	private final char[] content;
 	
+	private final RTaskMarkerHandler markers;
+	
 	private int currentOffset= 0;
 	private final int currentLine= 1;
 	private Last lastChar= Last.NONE;
-	private final LineInformation lineStructure;
 	
 	
-	public RdParser(final char[] content, final RTaskMarkerHandler markers) {
-		this.content= content;
+	public RdParser(final SourceContent sourceContent, final RTaskMarkerHandler markers) {
+		this.sourceContent= sourceContent;
+		this.content= sourceContent.getString().toCharArray();
 		this.markers= markers;
-		this.lineStructure= new LineInformation();
 	}
 	
 	public void check() throws CoreException {
@@ -182,7 +106,7 @@
 			}
 		}
 		try {
-			this.markers.checkForTasks(new String(this.content, start, end - start + 1), start, this.lineStructure);
+			this.markers.checkForTasks(start, end);
 		}
 		catch (final BadLocationException e) {
 		}
@@ -197,7 +121,6 @@
 				this.currentOffset++;
 			}
 			
-			this.lineStructure.addLine(this.currentOffset);
 			this.lastChar= Last.NEWLINE;
 			return true;
 		}
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/sourcemodel/RReconciler.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/sourcemodel/RReconciler.java
index fc214d6..1e65300 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/sourcemodel/RReconciler.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/sourcemodel/RReconciler.java
@@ -181,10 +181,10 @@
 			
 			final TextParserInput input;
 			if (data.content.getStartOffset() != 0) {
-				input= new OffsetStringParserInput(data.content.getText(), data.content.getStartOffset());
+				input= new OffsetStringParserInput(data.content.getString(), data.content.getStartOffset());
 			}
 			else {
-				input= this.raInput.reset(data.content.getText());
+				input= this.raInput.reset(data.content.getString());
 			}
 			
 			final RParser rParser= new RParser(AstInfo.LEVEL_MODEL_DEFAULT,
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/sourcemodel/SyntaxProblemReporter.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/sourcemodel/SyntaxProblemReporter.java
index a13d6b8..8355fe1 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/sourcemodel/SyntaxProblemReporter.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/sourcemodel/SyntaxProblemReporter.java
@@ -14,6 +14,8 @@
 
 package org.eclipse.statet.internal.r.core.sourcemodel;
 
+import static org.eclipse.statet.jcommons.lang.ObjectUtils.nonNullLateInit;
+
 import static org.eclipse.statet.ltk.ast.core.AstNode.NA_OFFSET;
 import static org.eclipse.statet.r.core.rsource.RSourceConstants.STATUS123_SYNTAX_NUMBER_EXP_DIGIT_MISSING;
 import static org.eclipse.statet.r.core.rsource.RSourceConstants.STATUS123_SYNTAX_NUMBER_HEX_DIGIT_MISSING;
@@ -133,16 +135,14 @@
 	
 	private final boolean reportSubsequent= false;
 	
-	private SourceUnit sourceUnit;
-	private SourceContent sourceContent;
-	private String currentText;
-	private ProblemRequestor currentRequestor;
+	private SourceUnit sourceUnit= nonNullLateInit();
+	private SourceContent sourceContent= nonNullLateInit();
+	private ProblemRequestor currentRequestor= nonNullLateInit();
 	
 	private final StringBuilder tmpBuilder= new StringBuilder();
 	private final MessageBuilder messageBuilder= new MessageBuilder();
 	private final List<Problem> problemBuffer= new ArrayList<>(BUFFER_SIZE);
 	private final RValueFormatter valueFormatter= new RValueFormatter();
-//	private int maxOffset;
 	
 	
 	public SyntaxProblemReporter() {
@@ -154,9 +154,6 @@
 		try {
 			this.sourceUnit= su;
 			this.sourceContent= content;
-			this.currentText= content.getText();
-//			this.currentDoc= su.getDocument(null);
-//			this.maxOffset= this.currentDoc.getLength();
 			this.currentRequestor= problemRequestor;
 			node.acceptInR(this);
 			if (this.problemBuffer.size() > 0) {
@@ -167,7 +164,6 @@
 		finally {
 			this.problemBuffer.clear();
 			this.sourceUnit= null;
-//			this.currentDoc= null;
 			this.currentRequestor= null;
 		}
 	}
@@ -222,14 +218,16 @@
 		else {
 			if (node.getLength() - offset > START_TEXT_LIMIT) {
 				final StringBuilder sb= getStringBuilder();
-				sb.append(this.sourceContent.getText(),
-						node.getStartOffset() + offset, node.getStartOffset() + offset + START_TEXT_LIMIT);
+				this.sourceContent.appendStringTo(sb,
+						node.getStartOffset() + offset,
+						node.getStartOffset() + offset + START_TEXT_LIMIT );
 				sb.append('…');
 				return sb.toString();
 			}
 			else {
-				return this.sourceContent.getText().substring(
-						node.getStartOffset() + offset, node.getEndOffset() + offset );
+				return this.sourceContent.getString(
+						node.getStartOffset() + offset,
+						node.getEndOffset() );
 			}
 		}
 	}
@@ -238,7 +236,10 @@
 		final String text= node.getText();
 		if (text != null) {
 			if (text.length() > FULL_TEXT_LIMIT) {
-				return text.substring(0, FULL_TEXT_LIMIT) + '…';
+				final StringBuilder sb= getStringBuilder();
+				sb.append(text, 0, FULL_TEXT_LIMIT);
+				sb.append('…');
+				return sb.toString();
 			}
 			else {
 				return text;
@@ -246,11 +247,17 @@
 		}
 		else {
 			if (node.getLength() > FULL_TEXT_LIMIT) {
-				return this.currentText.substring(node.getStartOffset(),
-						node.getStartOffset() + FULL_TEXT_LIMIT ) + '…';
+				final StringBuilder sb= getStringBuilder();
+				this.sourceContent.appendStringTo(sb,
+						node.getStartOffset(),
+						node.getStartOffset() + FULL_TEXT_LIMIT );
+				sb.append('…');
+				return sb.toString();
 			}
 			else {
-				return this.currentText.substring(node.getStartOffset(), node.getEndOffset());
+				return this.sourceContent.getString(
+						node.getStartOffset(),
+						node.getEndOffset() );
 			}
 		}
 	}
@@ -263,8 +270,9 @@
 			return text.substring(begin, begin + detail.getLength());
 		}
 		else {
-			return this.sourceContent.getText().substring(
-					detail.getStartOffset(), detail.getEndOffset() );
+			return this.sourceContent.getString(
+					detail.getStartOffset(),
+					detail.getEndOffset() );
 		}
 	}
 	
@@ -279,8 +287,9 @@
 							null)));
 		
 		case STATUS12_SYNTAX_TOKEN_UNEXPECTED:
-			addProblem(Problem.SEVERITY_ERROR, code,
-					this.messageBuilder.bind(ProblemMessages.Syntax_TokenUnexpected_message, getFullText(node)),
+			addProblem(Problem.SEVERITY_ERROR, code, this.messageBuilder.bind(
+					ProblemMessages.Syntax_TokenUnexpected_message,
+					getFullText(node) ),
 					node.getStartOffset(), node.getEndOffset() );
 			break STATUS;
 			
@@ -301,16 +310,18 @@
 		sb.append(" (").append(node.getStartOffset()).append(", ").append(node.getLength()).append(')'); //$NON-NLS-1$ //$NON-NLS-2$
 		sb.append('\n');
 		if (this.sourceContent != null) {
-			final TextLineInformation lines= this.sourceContent.getLines();
-			final int line= lines.getLineOfOffset(node.getStartOffset());
-			sb.append("  Line ").append((line + 1)).append(" (offset )").append(lines.getStartOffset(line)); //$NON-NLS-1$ //$NON-NLS-2$
+			final TextLineInformation lines= this.sourceContent.getStringLines();
+			final int line= lines.getLineOfOffset(node.getStartOffset() - this.sourceContent.getStartOffset());
+			sb.append("  Line ").append((line + 1)); //$NON-NLS-1$ //$NON-NLS-2$
 			sb.append('\n');
 			
 			final int firstLine= Math.max(0, line - 2);
-			final int lastLine= Math.min(lines.getNumberOfLines() - 1, lines.getLineOfOffset(line) + 2);
-			sb.append("  Source (line ").append((firstLine + 1)).append('-').append((lastLine)).append("): \n"); //$NON-NLS-1$ //$NON-NLS-2$
-			sb.append(this.currentText.substring(lines.getStartOffset(firstLine),
-					lines.getStartOffset(lastLine) ));
+			final int lastLine= Math.min(lines.getNumberOfLines() - 1,
+					lines.getLineOfOffset(node.getEndOffset() - this.sourceContent.getStartOffset()) + 2 );
+			sb.append("  Source (line ").append((firstLine + 1)).append('-').append((lastLine + 1)).append("): \n"); //$NON-NLS-1$ //$NON-NLS-2$
+			sb.append(this.sourceContent.getString(),
+					lines.getStartOffset(firstLine),
+					lines.getEndOffset(lastLine) );
 		}
 		RCorePlugin.log(new Status(IStatus.WARNING, RCore.BUNDLE_ID, sb.toString()));
 	}
diff --git a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/search/RElementSearch.java b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/search/RElementSearch.java
index 192e0b6..a71376a 100644
--- a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/search/RElementSearch.java
+++ b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/search/RElementSearch.java
@@ -96,7 +96,7 @@
 			
 			final RSourceUnitModelInfo modelInfo= (RSourceUnitModelInfo)sourceUnit.getModelInfo(RModel.R_TYPE_ID,
 					RModelManager.MODEL_FILE, progress.newChild(1) );
-			final SourceContent content= sourceUnit.getContent(progress.newChild(1));
+			final SourceContent sourceContent= sourceUnit.getContent(progress.newChild(1));
 			
 			final List<List<? extends RElementAccess>> allFrameAccess= new ArrayList<>();
 			for (final String frameId : this.definitionFrameIds) {
@@ -116,8 +116,7 @@
 				}
 			}
 			
-			final String contentText= content.getText();
-			final TextLineInformation lineInformation= content.getLines();
+			final TextLineInformation lines= sourceContent.getStringLines();
 			final Map<Integer, LineElement<RSourceUnit>> lineElements= new HashMap<>();
 			
 			for (final List<? extends RElementAccess> allAccess : allFrameAccess) {
@@ -127,12 +126,12 @@
 						final TextRegion region= RModelUtils.getNameSourceRegion(access);
 						
 						final Integer lineNumber= Integer.valueOf(
-								lineInformation.getLineOfOffset(region.getStartOffset()) );
+								lines.getLineOfOffset(region.getStartOffset()) );
 						LineElement<RSourceUnit> lineElement= lineElements.get(lineNumber);
 						if (lineElement == null) {
-							final int lineOffset= lineInformation.getStartOffset(lineNumber);
+							final int lineOffset= lines.getStartOffset(lineNumber);
 							lineElement= new LineElement<>(bestUnit, lineNumber, lineOffset,
-									getContent(contentText, lineOffset, lineOffset + lineInformation.getLength(lineNumber)) );
+									getContent(sourceContent, lineOffset, lines.getEndOffset(lineNumber)) );
 							lineElements.put(lineNumber, lineElement);
 						}
 						
@@ -156,13 +155,17 @@
 				access : null;
 	}
 	
-	private String getContent(final String text, final int start, final int end) {
+	private String getContent(final SourceContent sourceContent,
+			final int startOffset, final int endOffset) {
+		final String s= sourceContent.getString();
 		this.sb.setLength(0);
-		for (int idx= start; idx < end; idx++) {
-			final char c= text.charAt(idx);
+		final int end= endOffset - sourceContent.getStartOffset();
+		for (int idx= startOffset - sourceContent.getStartOffset(); idx < end; idx++) {
+			final char c= s.charAt(idx);
 			if (Character.isWhitespace(c) || Character.isISOControl(c)) {
 				this.sb.append(' ');
-			} else {
+			}
+			else {
 				this.sb.append(c);
 			}
 		}
diff --git a/redocs/org.eclipse.statet.redocs.r/src/org/eclipse/statet/redocs/r/core/model/RChunkReconciler.java b/redocs/org.eclipse.statet.redocs.r/src/org/eclipse/statet/redocs/r/core/model/RChunkReconciler.java
index 5b22a2c..9e206b2 100644
--- a/redocs/org.eclipse.statet.redocs.r/src/org/eclipse/statet/redocs/r/core/model/RChunkReconciler.java
+++ b/redocs/org.eclipse.statet.redocs.r/src/org/eclipse/statet/redocs/r/core/model/RChunkReconciler.java
@@ -101,10 +101,14 @@
 	}
 	
 	public void reconcileAst(final TModelContainer adapter,
-			final SourceContent content, final List<? extends EmbeddingAstNode> list,
+			final SourceContent sourceContent, final List<? extends EmbeddingAstNode> list,
 			final IProgressMonitor monitor) {
-		final String source= content.getText();
-		final TextLineInformation lines= content.getLines();
+		if (sourceContent.getStartOffset() != 0) {
+			throw new UnsupportedOperationException();
+		}
+		
+		final String source= sourceContent.getString();
+		final TextLineInformation lines= sourceContent.getStringLines();
 		
 		this.raChunkStartLineMatcher.reset(source);
 		if (this.raChunkRefLineMatcher != null) {
@@ -250,8 +254,8 @@
 							label= labelNode.getText();
 						}
 						else {
-							label= new String(content.getText().substring(
-								labelNode.getStartOffset(), labelNode.getEndOffset() ));
+							label= content.getString(
+									labelNode.getStartOffset(), labelNode.getEndOffset() );
 						}
 						name= RElementName.create(RElementName.MAIN_OTHER, label);
 						nameRegion= labelNode;
diff --git a/redocs/org.eclipse.statet.redocs.wikitext.r.textile/src/org/eclipse/statet/internal/redocs/wikitext/r/textile/core/TextileValidator.java b/redocs/org.eclipse.statet.redocs.wikitext.r.textile/src/org/eclipse/statet/internal/redocs/wikitext/r/textile/core/TextileValidator.java
index b527282..9344807 100644
--- a/redocs/org.eclipse.statet.redocs.wikitext.r.textile/src/org/eclipse/statet/internal/redocs/wikitext/r/textile/core/TextileValidator.java
+++ b/redocs/org.eclipse.statet.redocs.wikitext.r.textile/src/org/eclipse/statet/internal/redocs/wikitext/r/textile/core/TextileValidator.java
@@ -46,18 +46,20 @@
 	
 	
 	@Override
-	public void run(final WikitextSourceUnit su, final SourceContent content,
+	public void run(final WikitextSourceUnit su, final SourceContent sourceContent,
 			final WikidocSourceUnitModelInfo model,
 			final ProblemRequestor requestor, final int level, final IProgressMonitor monitor) {
+		if (sourceContent.getStartOffset() != 0) {
+			throw new UnsupportedOperationException();
+		}
 		
-		final Matcher matcher= BLOCK_START_PATTERN.matcher(content.getText());
+		final Matcher matcher= BLOCK_START_PATTERN.matcher(sourceContent.getString());
 		
-		final TextLineInformation lines= content.getLines();
-		final int numLines= lines.getNumberOfLines();
-		int start= 0;
-		for (int line= 0; line < numLines; line++) {
-			final int end= lines.getEndOffset(line);
-			matcher.region(start, end);
+		final TextLineInformation lines= sourceContent.getStringLines();
+		int startOffset= 0;
+		for (int line= 0; line < lines.getNumberOfLines(); line++) {
+			final int endOffset= lines.getEndOffset(line);
+			matcher.region(startOffset, endOffset);
 			if (matcher.find()) {
 				final String followingCharacter= matcher.group(2);
 				if (followingCharacter == null || !followingCharacter.equals(" ")) { //$NON-NLS-1$
@@ -65,10 +67,10 @@
 					requestor.acceptProblems(new BasicProblem(WikitextModel.WIKIDOC_TYPE_ID,
 							Problem.SEVERITY_WARNING, 0,
 							NLS.bind(Messages.Validation_BlockWhitespace_message, matched),
-							line, start, matcher.end(1) ));
+							line, startOffset, matcher.end(1) ));
 				}
 			}
-			start= end;
+			startOffset= endOffset;
 		}
 	}
 	
diff --git a/redocs/org.eclipse.statet.redocs.wikitext.r/src/org/eclipse/statet/internal/redocs/wikitext/r/ui/processing/YamlFormatDetector.java b/redocs/org.eclipse.statet.redocs.wikitext.r/src/org/eclipse/statet/internal/redocs/wikitext/r/ui/processing/YamlFormatDetector.java
index 9268787..9936765 100644
--- a/redocs/org.eclipse.statet.redocs.wikitext.r/src/org/eclipse/statet/internal/redocs/wikitext/r/ui/processing/YamlFormatDetector.java
+++ b/redocs/org.eclipse.statet.redocs.wikitext.r/src/org/eclipse/statet/internal/redocs/wikitext/r/ui/processing/YamlFormatDetector.java
@@ -23,11 +23,11 @@
 import org.eclipse.core.runtime.Status;
 import org.eclipse.core.runtime.SubMonitor;
 import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.Region;
 import org.eclipse.osgi.util.NLS;
 
+import org.eclipse.statet.jcommons.text.core.BasicTextRegion;
 import org.eclipse.statet.jcommons.text.core.TextLineInformation;
+import org.eclipse.statet.jcommons.text.core.TextRegion;
 
 import org.eclipse.statet.docmlet.base.ui.DocmlBaseUI;
 import org.eclipse.statet.docmlet.base.ui.processing.DocProcessingConfig;
@@ -71,15 +71,14 @@
 		try {
 			final SourceContent content= unit.getContent(m.newChild(1));
 			m.worked(0);
-			final IRegion yamlRegion= getYamlBlockRegion(content);
+			final TextRegion yamlRegion= getYamlBlockRegion(content);
 			m.worked(1);
 			
 			final YamlParser yamlParser= new YamlParser();
 			yamlParser.setScalarText(true);
 			
-			final String code= content.getText().substring(
-					yamlRegion.getOffset(), yamlRegion.getOffset() + yamlRegion.getLength());
-			final SourceComponent block= yamlParser.parse(code, null, yamlRegion.getOffset());
+			final String code= content.getString(yamlRegion);
+			final SourceComponent block= yamlParser.parse(code, null, yamlRegion.getStartOffset());
 			
 			final String format= searchOutputInfo(block, code);
 			final String ext= toExtension(format);
@@ -104,11 +103,11 @@
 	}
 	
 	
-	private IRegion getYamlBlockRegion(final SourceContent content)
+	private TextRegion getYamlBlockRegion(final SourceContent sourceContent)
 			throws BadLocationException, CoreException {
-		final TextLineInformation lines= content.getLines();
+		final TextLineInformation lines= sourceContent.getStringLines();
 		final YamlBlockWeaveParticipant part= new YamlBlockWeaveParticipant();
-		part.reset(content);
+		part.reset(sourceContent);
 		
 		int lineEndOffset= lines.getStartOffset(0);
 		final int numLines= lines.getNumberOfLines();
@@ -120,13 +119,15 @@
 					lineOffset= lineEndOffset;
 					lineEndOffset= lines.getEndOffset(line);
 					if (part.checkEndLine(lineOffset, lineEndOffset)) {
-						return new Region(part.getStartOffset(), lineEndOffset);
+						return new BasicTextRegion(
+								sourceContent.getStartOffset() + part.getStartOffset(),
+								sourceContent.getStartOffset() + lineEndOffset );
 					}
 				}
 			}
 		}
 		throw new CoreException(new Status(IStatus.ERROR, WikitextRweaveCore.BUNDLE_ID,
-				"No YAML metadata block found."));
+				"No YAML metadata block found." ));
 	}
 	
 	
diff --git a/rhelp/org.eclipse.statet.rhelp.core/src/org/eclipse/statet/rhelp/core/update/REnvIndexUpdater.java b/rhelp/org.eclipse.statet.rhelp.core/src/org/eclipse/statet/rhelp/core/update/REnvIndexUpdater.java
index 516d523..8454e04 100644
--- a/rhelp/org.eclipse.statet.rhelp.core/src/org/eclipse/statet/rhelp/core/update/REnvIndexUpdater.java
+++ b/rhelp/org.eclipse.statet.rhelp.core/src/org/eclipse/statet/rhelp/core/update/REnvIndexUpdater.java
@@ -384,7 +384,7 @@
 				if (idx < 0) {
 					continue;
 				}
-				final String descr= new String(line.substring(idx + 1).trim());
+				final String descr= line.substring(idx + 1).trim();
 				line= line.substring(0, idx);
 				this.index.addDefaultKeyword(line.split("\\|"), descr); //$NON-NLS-1$
 			}
