diff --git a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RCharacterFix64Store.java b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RCharacterFix64Store.java
index b3b3b88..4bd1fe4 100644
--- a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RCharacterFix64Store.java
+++ b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RCharacterFix64Store.java
@@ -21,9 +21,13 @@
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 import org.eclipse.statet.jcommons.lang.Nullable;
 
+import org.eclipse.statet.rj.data.RCharacterStore;
 import org.eclipse.statet.rj.data.RJIO;
 
 
+/**
+ * {@link RCharacterStore} supporting long length.
+ */
 @NonNullByDefault
 public class RCharacterFix64Store extends AbstractCharacterStore
 		implements ExternalizableRStore {
@@ -109,11 +113,13 @@
 	}
 	
 	@Override
+	@SuppressWarnings("null")
 	public String getChar(final int idx) {
 		return this.charValues[idx / SEGMENT_LENGTH][idx % SEGMENT_LENGTH];
 	}
 	
 	@Override
+	@SuppressWarnings("null")
 	public String getChar(final long idx) {
 		return this.charValues[(int)(idx / SEGMENT_LENGTH)][(int)(idx % SEGMENT_LENGTH)];
 	}
@@ -151,11 +157,10 @@
 	public @Nullable String [] toArray() {
 		final int l= checkToArrayLength();
 		final var array= new @Nullable String[l];
-		int k= 0;
-		for (int i= 0; i < this.charValues.length; i++) {
+		for (int i= 0, destIdx= 0; i < this.charValues.length; i++) {
 			final String[] chars= this.charValues[i];
-			System.arraycopy(chars, 0, array, k, chars.length);
-			k+= chars.length;
+			System.arraycopy(chars, 0, array, destIdx, chars.length);
+			destIdx+= chars.length;
 		}
 		return array;
 	}
@@ -182,7 +187,7 @@
 	}
 	
 	@Override
-	public long indexOf(final String character, long fromIdx) {
+	public long indexOf(final @Nullable String character, long fromIdx) {
 		if (character == null) {
 			return -1;
 		}
diff --git a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RComplexBFix64Store.java b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RComplexBFix64Store.java
index 344afdb..9c18aa8 100644
--- a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RComplexBFix64Store.java
+++ b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RComplexBFix64Store.java
@@ -20,10 +20,14 @@
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 import org.eclipse.statet.jcommons.lang.Nullable;
 
+import org.eclipse.statet.rj.data.RComplexStore;
 import org.eclipse.statet.rj.data.RJIO;
 import org.eclipse.statet.rj.data.RStore;
 
 
+/**
+ * {@link RComplexStore} supporting long length.
+ */
 @NonNullByDefault
 public class RComplexBFix64Store extends AbstractComplexStore
 		implements ExternalizableRStore {
@@ -278,15 +282,14 @@
 	public @Nullable Complex [] toArray() {
 		final int l= checkToArrayLength();
 		final var array= new @Nullable Complex [l];
-		int k= 0;
-		for (int i= 0; i < this.realValues.length; i++, k++) {
-			final double[] reals= this.realValues[i];
-			final double[] imgs= this.imaginaryValues[i];
-			for (int j= 0; j < reals.length; j++) {
-				final double v= reals[j];
+		for (int i= 0, destIdx= 0; i < this.realValues.length; i++) {
+			final double[] res= this.realValues[i];
+			final double[] ims= this.imaginaryValues[i];
+			for (int j= 0; j < res.length; j++, destIdx++) {
+				final double v= res[j];
 				if (!Double.isNaN(v)
 						|| (int)Double.doubleToRawLongBits(v) != NA_numeric_INT_MATCH) {
-					array[k]= new Complex(v, imgs[i]);
+					array[destIdx]= new Complex(v, ims[j]);
 				}
 			}
 		}
diff --git a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RFactorFix64Store.java b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RFactorFix64Store.java
index 9abea94..4b1d208 100644
--- a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RFactorFix64Store.java
+++ b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RFactorFix64Store.java
@@ -22,10 +22,14 @@
 import org.eclipse.statet.jcommons.lang.Nullable;
 
 import org.eclipse.statet.rj.data.RCharacterStore;
+import org.eclipse.statet.rj.data.RFactorStore;
 import org.eclipse.statet.rj.data.RJIO;
 import org.eclipse.statet.rj.data.RStore;
 
 
+/**
+ * {@link RFactorStore} supporting long length.
+ */
 @NonNullByDefault
 public class RFactorFix64Store extends AbstractFactorStore
 		implements ExternalizableRStore {
@@ -234,13 +238,12 @@
 	public @Nullable Integer[] toArray() {
 		final int l= checkToArrayLength();
 		final var array= new @Nullable Integer [l];
-		int k= 0;
-		for (int i= 0; i < this.codes.length; i++, k++) {
+		for (int i= 0, destIdx= 0; i < this.codes.length; i++) {
 			final int[] ints= this.codes[i];
-			for (int j= 0; j < ints.length; j++) {
+			for (int j= 0; j < ints.length; j++, destIdx++) {
 				final int code= ints[j];
 				if (code > 0) {
-					array[k]= Integer.valueOf(code);
+					array[destIdx]= Integer.valueOf(code);
 				}
 			}
 		}
@@ -292,7 +295,7 @@
 	}
 	
 	@Override
-	public long indexOf(final String character, final long fromIdx) {
+	public long indexOf(final @Nullable String character, final long fromIdx) {
 		final int code= ((character != null) ?
 				this.codeLabels.indexOf(character, 0) :
 				this.codeLabels.indexOfNA(0) ) + 1;
diff --git a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RIntegerFix64Store.java b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RIntegerFix64Store.java
index fda5bc3..c9bb1ac 100644
--- a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RIntegerFix64Store.java
+++ b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RIntegerFix64Store.java
@@ -20,9 +20,13 @@
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 import org.eclipse.statet.jcommons.lang.Nullable;
 
+import org.eclipse.statet.rj.data.RIntegerStore;
 import org.eclipse.statet.rj.data.RJIO;
 
 
+/**
+ * {@link RIntegerStore} supporting long length.
+ */
 @NonNullByDefault
 public class RIntegerFix64Store extends AbstractIntegerStore
 		implements ExternalizableRStore {
@@ -177,14 +181,13 @@
 	@Override
 	public @Nullable Integer [] toArray() {
 		final int l= checkToArrayLength();
-		final var array= new @Nullable Integer [l];
-		int k= 0;
-		for (int i= 0; i < this.intValues.length; i++, k++) {
+		final var array= new @Nullable Integer[l];
+		for (int i= 0, destIdx= 0; i < this.intValues.length; i++) {
 			final int[] ints= this.intValues[i];
-			for (int j= 0; j < ints.length; j++) {
+			for (int j= 0; j < ints.length; j++, destIdx++) {
 				final int v= ints[j];
 				if (v != NA_integer_INT) {
-					array[k]= Integer.valueOf(v);
+					array[destIdx]= Integer.valueOf(v);
 				}
 			}
 		}
diff --git a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RLogicalByteFix64Store.java b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RLogicalByteFix64Store.java
index 8bdb545..c173da4 100644
--- a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RLogicalByteFix64Store.java
+++ b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RLogicalByteFix64Store.java
@@ -21,12 +21,11 @@
 import org.eclipse.statet.jcommons.lang.Nullable;
 
 import org.eclipse.statet.rj.data.RJIO;
+import org.eclipse.statet.rj.data.RLogicalStore;
 
 
 /**
- * Based on byte array.
- * 
- * This implementation is limited to length of 2<sup>31</sup>-1.
+ * {@link RLogicalStore} supporting long length.
  */
 @NonNullByDefault
 public class RLogicalByteFix64Store extends AbstractLogicalStore
@@ -199,16 +198,15 @@
 	public @Nullable Boolean [] toArray() {
 		final int l= checkToArrayLength();
 		final var array= new @Nullable Boolean [l];
-		int k= 0;
-		for (int i= 0; i < this.boolValues.length; i++, k++) {
+		for (int i= 0, destIdx= 0; i < this.boolValues.length; i++) {
 			final byte[] bools= this.boolValues[i];
-			for (int j= 0; j < bools.length; j++) {
+			for (int j= 0; j < bools.length; j++, destIdx++) {
 				switch(bools[j]) {
 				case TRUE_BYTE:
-					array[k]= Boolean.TRUE;
+					array[destIdx]= Boolean.TRUE;
 					continue;
 				case FALSE_BYTE:
-					array[k]= Boolean.FALSE;
+					array[destIdx]= Boolean.FALSE;
 					continue;
 				default:
 					continue;
diff --git a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RNumericBFix64Store.java b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RNumericBFix64Store.java
index bc53351..80e0721 100644
--- a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RNumericBFix64Store.java
+++ b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RNumericBFix64Store.java
@@ -21,8 +21,12 @@
 import org.eclipse.statet.jcommons.lang.Nullable;
 
 import org.eclipse.statet.rj.data.RJIO;
+import org.eclipse.statet.rj.data.RNumericStore;
 
 
+/**
+ * {@link RNumericStore} supporting long length.
+ */
 @NonNullByDefault
 public class RNumericBFix64Store extends AbstractNumericStore
 		implements ExternalizableRStore {
@@ -199,10 +203,9 @@
 	public @Nullable Double [] toArray() {
 		final int l= checkToArrayLength();
 		final var array= new @Nullable Double [l];
-		int k= 0;
-		for (int i= 0; i < this.realValues.length; i++, k++) {
+		for (int i= 0, k= 0; i < this.realValues.length; i++) {
 			final double[] reals= this.realValues[i];
-			for (int j= 0; j < reals.length; j++) {
+			for (int j= 0; j < reals.length; j++, k++) {
 				final double v= reals[j];
 				if (!Double.isNaN(v)
 						|| (int)Double.doubleToRawLongBits(v) != NA_numeric_INT_MATCH) {
diff --git a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RRawFix64Store.java b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RRawFix64Store.java
index b8fe43b..4394e4d 100644
--- a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RRawFix64Store.java
+++ b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RRawFix64Store.java
@@ -20,9 +20,13 @@
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 
 import org.eclipse.statet.rj.data.RJIO;
+import org.eclipse.statet.rj.data.RRawStore;
 import org.eclipse.statet.rj.data.RStore;
 
 
+/**
+ * {@link RRawStore} supporting long length.
+ */
 @NonNullByDefault
 public class RRawFix64Store extends AbstractRawStore
 		implements ExternalizableRStore {
@@ -117,11 +121,10 @@
 	public @NonNull Byte [] toArray() {
 		final int l= checkToArrayLength();
 		final var array= new @NonNull Byte [l];
-		int k= 0;
-		for (int i= 0; i < this.byteValues.length; i++, k++) {
+		for (int i= 0, destIdx= 0; i < this.byteValues.length; i++) {
 			final byte[] raws= this.byteValues[i];
-			for (int j= 0; j < raws.length; j++) {
-				array[k]= Byte.valueOf(raws[j]);
+			for (int j= 0; j < raws.length; j++, destIdx++) {
+				array[destIdx]= Byte.valueOf(raws[j]);
 			}
 		}
 		return array;
