Bug 568167: [RJ-Data] Add junit test for R data store implementations

Change-Id: I908566d067246f84f58f59f217d00688ce72b424
diff --git a/core/org.eclipse.statet.rj.data-tests/.classpath b/core/org.eclipse.statet.rj.data-tests/.classpath
new file mode 100644
index 0000000..322c4fc
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/.classpath
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11">
+		<attributes>
+			<attribute name="module" value="true"/>
+			<attribute name="annotationpath" value="/org.eclipse.statet/eea/"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
+		<attributes>
+			<attribute name="annotationpath" value="/org.eclipse.statet/eea/"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="src" path="src">
+		<attributes>
+			<attribute name="test" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/core/org.eclipse.statet.rj.data-tests/.gitignore b/core/org.eclipse.statet.rj.data-tests/.gitignore
new file mode 100644
index 0000000..b83d222
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/.gitignore
@@ -0,0 +1 @@
+/target/
diff --git a/core/org.eclipse.statet.rj.data-tests/.project b/core/org.eclipse.statet.rj.data-tests/.project
new file mode 100644
index 0000000..b3d9cf4
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.statet.rj.data-tests</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/core/org.eclipse.statet.rj.data-tests/.settings/org.eclipse.core.resources.prefs b/core/org.eclipse.statet.rj.data-tests/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..99f26c0
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/core/org.eclipse.statet.rj.data-tests/.settings/org.eclipse.core.runtime.prefs b/core/org.eclipse.statet.rj.data-tests/.settings/org.eclipse.core.runtime.prefs
new file mode 100644
index 0000000..5a0ad22
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/.settings/org.eclipse.core.runtime.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+line.separator=\n
diff --git a/core/org.eclipse.statet.rj.data-tests/.settings/org.eclipse.jdt.core.prefs b/core/org.eclipse.statet.rj.data-tests/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..db488b8
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,513 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.statet.jcommons.lang.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.statet.jcommons.lang.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.statet.jcommons.lang.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=enabled
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=11
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
+org.eclipse.jdt.core.compiler.problem.annotatedTypeArgumentToUnannotated=info
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=info
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=warning
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.suppressWarningsNotFullyAnalysed=info
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=info
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=info
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
+org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
+org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false
+org.eclipse.jdt.core.formatter.align_with_spaces=false
+org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_annotations_on_enum_constant=49
+org.eclipse.jdt.core.formatter.alignment_for_annotations_on_field=49
+org.eclipse.jdt.core.formatter.alignment_for_annotations_on_local_variable=49
+org.eclipse.jdt.core.formatter.alignment_for_annotations_on_method=49
+org.eclipse.jdt.core.formatter.alignment_for_annotations_on_package=49
+org.eclipse.jdt.core.formatter.alignment_for_annotations_on_parameter=0
+org.eclipse.jdt.core.formatter.alignment_for_annotations_on_type=49
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=80
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assertion_message=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=16
+org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=32
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=49
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=80
+org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_module_statements=80
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_record_components=16
+org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=85
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0
+org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_record_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_type_annotations=0
+org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0
+org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=80
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=2
+org.eclipse.jdt.core.formatter.blank_lines_after_last_class_body_declaration=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=-2
+org.eclipse.jdt.core.formatter.blank_lines_before_abstract_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=1
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=-2
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=2
+org.eclipse.jdt.core.formatter.blank_lines_before_package=-2
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=-2
+org.eclipse.jdt.core.formatter.blank_lines_between_statement_group_in_switch=0
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=2
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_record_constructor=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_record_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=false
+org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=false
+org.eclipse.jdt.core.formatter.comment.format_block_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=false
+org.eclipse.jdt.core.formatter.comment.indent_tag_description=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_between_different_tags=do not insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert
+org.eclipse.jdt.core.formatter.comment.line_length=100
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=false
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_record_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_record_components=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_switch_case_expressions=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_not_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_record_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case=insert
+org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_record_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_record_components=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_switch_case_expressions=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_record_constructor=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_record_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_record_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_record_constructor_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_record_declaration_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.lineSplit=100
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_after_code_block=0
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_code_block=0
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=-1
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_end_of_code_block=-1
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_end_of_method_body=-1
+org.eclipse.jdt.core.formatter.number_of_blank_lines_before_code_block=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=2
+org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_record_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.text_block_indentation=0
+org.eclipse.jdt.core.formatter.use_on_off_tags=false
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_assertion_message_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
+org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=false
+org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter
diff --git a/core/org.eclipse.statet.rj.data-tests/.settings/org.eclipse.jdt.ui.prefs b/core/org.eclipse.statet.rj.data-tests/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..08d6901
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,189 @@
+cleanup.add_default_serial_version_id=true
+cleanup.add_generated_serial_version_id=false
+cleanup.add_missing_annotations=true
+cleanup.add_missing_deprecated_annotations=true
+cleanup.add_missing_methods=false
+cleanup.add_missing_nls_tags=false
+cleanup.add_missing_override_annotations=true
+cleanup.add_missing_override_annotations_interface_methods=true
+cleanup.add_remove_all=true
+cleanup.add_serial_version_id=false
+cleanup.always_use_blocks=true
+cleanup.always_use_parentheses_in_expressions=true
+cleanup.always_use_this_for_non_static_field_access=true
+cleanup.always_use_this_for_non_static_method_access=false
+cleanup.arrays_fill=true
+cleanup.bitwise_conditional_expression=false
+cleanup.boolean_literal=true
+cleanup.collection_cloning=false
+cleanup.convert_functional_interfaces=false
+cleanup.convert_to_enhanced_for_loop=false
+cleanup.convert_to_enhanced_for_loop_if_loop_var_used=false
+cleanup.convert_to_switch_expressions=false
+cleanup.correct_indentation=false
+cleanup.embedded_if=false
+cleanup.format_source_code=false
+cleanup.format_source_code_changes_only=false
+cleanup.if_condition=true
+cleanup.insert_inferred_type_arguments=false
+cleanup.instanceof=true
+cleanup.lazy_logical_operator=false
+cleanup.make_local_variable_final=true
+cleanup.make_parameters_final=true
+cleanup.make_private_fields_final=true
+cleanup.make_type_abstract_if_missing_method=false
+cleanup.make_variable_declarations_final=true
+cleanup.map_cloning=false
+cleanup.merge_conditional_blocks=false
+cleanup.never_use_blocks=false
+cleanup.never_use_parentheses_in_expressions=false
+cleanup.no_string_creation=false
+cleanup.no_super=false
+cleanup.number_suffix=true
+cleanup.objects_equals=false
+cleanup.organize_imports=true
+cleanup.precompile_regex=true
+cleanup.push_down_negation=false
+cleanup.qualify_static_field_accesses_with_declaring_class=false
+cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=false
+cleanup.qualify_static_member_accesses_with_declaring_class=true
+cleanup.qualify_static_method_accesses_with_declaring_class=false
+cleanup.redundant_falling_through_block_end=false
+cleanup.remove_private_constructors=true
+cleanup.remove_redundant_modifiers=false
+cleanup.remove_redundant_semicolons=true
+cleanup.remove_redundant_type_arguments=true
+cleanup.remove_trailing_whitespaces=false
+cleanup.remove_trailing_whitespaces_all=true
+cleanup.remove_trailing_whitespaces_ignore_empty=false
+cleanup.remove_unnecessary_array_creation=true
+cleanup.remove_unnecessary_casts=true
+cleanup.remove_unnecessary_nls_tags=true
+cleanup.remove_unused_imports=true
+cleanup.remove_unused_local_variables=false
+cleanup.remove_unused_private_fields=true
+cleanup.remove_unused_private_members=false
+cleanup.remove_unused_private_methods=true
+cleanup.remove_unused_private_types=true
+cleanup.simplify_lambda_expression_and_method_ref=false
+cleanup.sort_members=false
+cleanup.sort_members_all=false
+cleanup.use_anonymous_class_creation=false
+cleanup.use_autoboxing=false
+cleanup.use_blocks=true
+cleanup.use_blocks_only_for_return_and_throw=false
+cleanup.use_directly_map_method=false
+cleanup.use_lambda=false
+cleanup.use_parentheses_in_expressions=false
+cleanup.use_this_for_non_static_field_access=true
+cleanup.use_this_for_non_static_field_access_only_if_necessary=false
+cleanup.use_this_for_non_static_method_access=true
+cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+cleanup.use_unboxing=false
+cleanup.use_var=false
+cleanup.useless_continue=false
+cleanup.useless_return=false
+cleanup_profile=_StatET
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_StatET
+formatter_settings_version=20
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=\#java;\#;\#org.eclipse.statet.jcommons;\#org.eclipse.statet.ecommons;\#org.eclipse.statet;java;javax;com.ibm.icu;org.osgi;org.eclipse;;org.eclipse.statet.jcommons;org.eclipse.statet.ecommons;org.eclipse.statet;
+org.eclipse.jdt.ui.javadoc=true
+org.eclipse.jdt.ui.keywordthis=true
+org.eclipse.jdt.ui.ondemandthreshold=99
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.staticondemandthreshold=99
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\#\n \# Copyright (c) ${year} ${user} and others.\n \# \n \# This program and the accompanying materials are made available under the\n \# terms of the Eclipse Public License 2.0 which is available at\n \# https\://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0\n \# which is available at https\://www.apache.org/licenses/LICENSE-2.0.\n \# \n \# SPDX-License-Identifier\: EPL-2.0 OR Apache-2.0\n \# \n \# Contributors\:\n \#     ${user} - initial API and implementation\n \#\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=*/</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * \n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="modulecomment_context" deleted\="false" description\="Comment for modules" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.modulecomment" name\="modulecomment">/**\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="recordbody_context" deleted\="false" description\="Code in new record type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.recordbody" name\="recordbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=true
+sp_cleanup.add_remove_all=false
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=true
+sp_cleanup.always_use_this_for_non_static_field_access=true
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.arrays_fill=false
+sp_cleanup.bitwise_conditional_expression=false
+sp_cleanup.boolean_literal=false
+sp_cleanup.collection_cloning=false
+sp_cleanup.convert_functional_interfaces=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.convert_to_enhanced_for_loop_if_loop_var_used=false
+sp_cleanup.convert_to_switch_expressions=false
+sp_cleanup.correct_indentation=false
+sp_cleanup.embedded_if=false
+sp_cleanup.format_source_code=false
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.if_condition=false
+sp_cleanup.insert_inferred_type_arguments=false
+sp_cleanup.instanceof=false
+sp_cleanup.lazy_logical_operator=false
+sp_cleanup.make_local_variable_final=true
+sp_cleanup.make_parameters_final=true
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=false
+sp_cleanup.map_cloning=false
+sp_cleanup.merge_conditional_blocks=false
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=false
+sp_cleanup.no_string_creation=false
+sp_cleanup.no_super=false
+sp_cleanup.number_suffix=true
+sp_cleanup.objects_equals=false
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.precompile_regex=false
+sp_cleanup.push_down_negation=false
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.redundant_falling_through_block_end=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_redundant_modifiers=false
+sp_cleanup.remove_redundant_semicolons=true
+sp_cleanup.remove_redundant_type_arguments=true
+sp_cleanup.remove_trailing_whitespaces=false
+sp_cleanup.remove_trailing_whitespaces_all=false
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=true
+sp_cleanup.remove_unnecessary_array_creation=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=false
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=false
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=false
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.simplify_lambda_expression_and_method_ref=false
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_anonymous_class_creation=false
+sp_cleanup.use_autoboxing=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_directly_map_method=false
+sp_cleanup.use_lambda=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=true
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=false
+sp_cleanup.use_this_for_non_static_method_access=true
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+sp_cleanup.use_unboxing=false
+sp_cleanup.use_var=false
+sp_cleanup.useless_continue=false
+sp_cleanup.useless_return=false
diff --git a/core/org.eclipse.statet.rj.data-tests/META-INF/MANIFEST.MF b/core/org.eclipse.statet.rj.data-tests/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..85e5423
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/META-INF/MANIFEST.MF
@@ -0,0 +1,13 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: org.eclipse.statet.rj.data.tests
+Automatic-Module-Name: org.eclipse.statet.rj.data.tests
+Bundle-Version: 4.3.0.qualifier
+Bundle-Vendor: Eclipse StatET
+Bundle-Name: StatET RJ - Data - Tests  (Incubation)
+Fragment-Host: org.eclipse.statet.rj.services.core
+Bundle-RequiredExecutionEnvironment: JavaSE-11
+Import-Package: org.junit.jupiter.api;version="5.6.0",
+ org.junit.jupiter.api.function;version="5.6.0",
+ org.junit.jupiter.params;version="5.6.0",
+ org.junit.jupiter.params.provider;version="5.6.0"
diff --git a/core/org.eclipse.statet.rj.data-tests/about.html b/core/org.eclipse.statet.rj.data-tests/about.html
new file mode 100644
index 0000000..f094738
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/about.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+		"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>January 1, 2019</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;). Unless
+	otherwise indicated below, the Content is provided to you under the terms and conditions of the
+	Eclipse Public License Version 2.0 (&quot;EPL&quot;), or the Apache License, Version 2.0 (AL).
+	A copy of the EPL is available at <a href="https://www.eclipse.org/legal/epl-2.0"
+	>https://www.eclipse.org/legal/epl-2.0</a>. For purposes of the EPL, &quot;Program&quot; will
+	mean the Content. A copy of the AL is available at <a href="https://www.apache.org/licenses/LICENSE-2.0"
+	>https://www.apache.org/licenses/LICENSE-2.0</a>.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being
+	redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions
+	may apply to your use of any object code in the Content. Check the Redistributor's license that
+	was provided with the Content. If no such license exists, contact the Redistributor. Unless
+	otherwise indicated below, the terms and conditions of the EPL or AL still apply to any source
+	code in the Content and such source code may be obtained at <a href="https://www.eclipse.org/"
+	>https://www.eclipse.org</a>.</p>
+
+</body>
+</html>
diff --git a/core/org.eclipse.statet.rj.data-tests/build.properties b/core/org.eclipse.statet.rj.data-tests/build.properties
new file mode 100644
index 0000000..239dd55
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/build.properties
@@ -0,0 +1,8 @@
+source..= src/
+output..= target/classes/
+javacDefaultEncoding..= UTF-8
+
+bin.includes= META-INF/,\
+              .,\
+              about.html
+src.includes= .settings/org.eclipse.core.resources.prefs
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/AbstractRStoreTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/AbstractRStoreTest.java
new file mode 100644
index 0000000..80a7d09
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/AbstractRStoreTest.java
@@ -0,0 +1,226 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ # 
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ # 
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ # 
+ # Contributors:
+ #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.util.function.IntConsumer;
+import java.util.function.LongConsumer;
+import java.util.function.Supplier;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.rj.data.RJIO;
+import org.eclipse.statet.rj.data.RStore;
+
+
+@NonNullByDefault
+public abstract class AbstractRStoreTest {
+	
+	
+	static boolean isBigDataEnabled(final int factor) {
+		return AbstractRawStore.DEFAULT_LONG_DATA_SEGMENT_LENGTH <= (1 << 16);
+	}
+	
+	
+	private static class IndexMessageSupplier implements Supplier<String> {
+		
+		private final String part1;
+		private long index;
+		
+		public IndexMessageSupplier(final String part1) {
+			this.part1= part1;
+		}
+		
+		@Override
+		public String get() {
+			return this.part1 + " at data index [" + this.index + "]";
+		}
+		
+	}
+	
+	private static final IndexMessageSupplier ARRAY_DIFFERS_MESSAGE= new IndexMessageSupplier("array differs");
+	private static final IndexMessageSupplier STORE_DIFFERS_MESSAGE= new IndexMessageSupplier("store differs");
+	
+	static final Supplier<String> arrayDiffersAt(final int index) {
+		final IndexMessageSupplier supplier= ARRAY_DIFFERS_MESSAGE;
+		supplier.index= index;
+		return supplier;
+	}
+	
+	static final Supplier<String> storeDiffersAt(final int index) {
+		final IndexMessageSupplier supplier= STORE_DIFFERS_MESSAGE;
+		supplier.index= index;
+		return supplier;
+	}
+	
+	
+	static class CaseData {
+		
+		
+		final String label;
+		
+		final int length;
+		
+		final boolean[] nas;
+		
+		
+		public CaseData(final String label, final boolean[] nas) {
+			this.label= label;
+			this.length= nas.length;
+			this.nas= nas;
+		}
+		
+		public CaseData(final String label, final int length) {
+			this.label= label;
+			this.length= length;
+			this.nas= new boolean[length];
+		}
+		
+		
+		@Override
+		public String toString() {
+			return this.label;
+		}
+		
+	}
+	
+	static int getSegmentCount(final CaseData data, final int segmentLength) {
+		if (data.length == 0) {
+			return 0;
+		}
+		return 1 + (data.length - 1) / segmentLength;
+	}
+	
+	
+	@FunctionalInterface
+	protected static interface StoreConstructor<TStore extends ExternalizableRStore> {
+		
+		TStore create(final RJIO in, final int length) throws IOException;
+		
+	}
+	
+	protected <TStore extends RStore<?> & ExternalizableRStore> byte[] writeExternal(
+			final TStore store) throws IOException {
+		final ByteArrayOutputStream byteOut= new ByteArrayOutputStream();
+		final ObjectOutputStream objOut= new ObjectOutputStream(byteOut);
+		final RJIO out= RJIO.get(objOut);
+		try {
+			out.flags= 0;
+			out.writeLong(store.getLength());
+			store.writeExternal(out);
+		}
+		finally {
+			out.disconnect(objOut);
+		}
+		objOut.close();
+		return byteOut.toByteArray();
+	}
+	
+	protected <TStore extends RStore<?> & ExternalizableRStore> TStore readExternal(
+			final StoreConstructor<TStore> constructor, final byte[] serBytes) throws IOException {
+		final ByteArrayInputStream byteIn= new ByteArrayInputStream(serBytes);
+		final ObjectInputStream objIn= new ObjectInputStream(byteIn);
+		final RJIO in= RJIO.get(objIn);
+		try {
+			in.flags= 0;
+			final long length= in.readLong();
+			if (length > Integer.MAX_VALUE) {
+				fail("actual: " + length);
+			}
+			return constructor.create(in, (int)length);
+		}
+		finally {
+			in.disconnect(objIn);
+		}
+	}
+	
+	protected <TStore extends RStore<?> & ExternalizableRStore> TStore createSerStore(
+			final TStore store, final StoreConstructor<TStore> constructor) {
+		try {
+			final byte[] serBytes= writeExternal(store);
+			return readExternal(constructor, serBytes);
+		}
+		catch (final IOException e) {
+			throw new RuntimeException(e);
+		}
+	}
+	
+	
+	static void checkLength(final CaseData data, final RStore<?> store) {
+		assertEquals(data.length, store.getLength());
+	}
+	
+	static void checkIsNA(final CaseData data, final RStore<?> store) {
+		for (int i= 0; i < data.length; i++) {
+			final int i0= i;
+			if (data.nas[i0]) {
+				assertTrue(store.isNA(i0), storeDiffersAt(i0));
+				assertTrue(store.isNA((long)i0), storeDiffersAt(i0));
+			}
+			else {
+				assertFalse(store.isNA(i0), storeDiffersAt(i0));
+				assertFalse(store.isNA((long)i0), storeDiffersAt(i0));
+			}
+		}
+		assertIndexOutOfBounds(data, store::isNA, store::isNA);
+	}
+	
+	static void checkIsMissingNonNum(final CaseData data, final RStore<?> store) {
+		for (int i= 0; i < data.length; i++) {
+			final int i0= i;
+			if (data.nas[i0]) {
+				assertTrue(store.isMissing(i0), storeDiffersAt(i0));
+				assertTrue(store.isMissing((long)i0), storeDiffersAt(i0));
+			}
+			else {
+				assertFalse(store.isMissing(i0), storeDiffersAt(i0));
+				assertFalse(store.isMissing((long)i0), storeDiffersAt(i0));
+			}
+		}
+		assertIndexOutOfBounds(data, store::isMissing, store::isMissing);
+	}
+	
+	
+	static void assertUnsupported(final CaseData data, final IntConsumer intMethod, final LongConsumer longMethod) {
+		if (data.length > 0) {
+			assertThrows(UnsupportedOperationException.class, () -> intMethod.accept(0));
+			assertThrows(UnsupportedOperationException.class, () -> longMethod.accept(0));
+		}
+		assertThrows(UnsupportedOperationException.class, () -> intMethod.accept(-1));
+		assertThrows(UnsupportedOperationException.class, () -> longMethod.accept(-1));
+		assertThrows(UnsupportedOperationException.class, () -> intMethod.accept(data.length));
+		assertThrows(UnsupportedOperationException.class, () -> longMethod.accept(data.length));
+		assertThrows(UnsupportedOperationException.class, () -> longMethod.accept(Long.MAX_VALUE));
+	}
+	
+	static void assertIndexOutOfBounds(final CaseData data, final IntConsumer intMethod, final LongConsumer longMethod) {
+		assertThrows(IndexOutOfBoundsException.class, () -> intMethod.accept(-1));
+		assertThrows(IndexOutOfBoundsException.class, () -> longMethod.accept(-1));
+		assertThrows(IndexOutOfBoundsException.class, () -> intMethod.accept(data.length));
+		assertThrows(IndexOutOfBoundsException.class, () -> longMethod.accept(data.length));
+		assertThrows(IndexOutOfBoundsException.class, () -> longMethod.accept(Long.MAX_VALUE));
+	}
+	
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RCharacter32StoreSerTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RCharacter32StoreSerTest.java
new file mode 100644
index 0000000..cdd2cf4
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RCharacter32StoreSerTest.java
@@ -0,0 +1,36 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ # 
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ # 
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ # 
+ # Contributors:
+ #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.rj.data.RCharacterStore;
+
+
+@NonNullByDefault
+public class RCharacter32StoreSerTest extends RCharacter32StoreTest {
+	
+	
+	public RCharacter32StoreSerTest() {
+	}
+	
+	
+	@Override
+	protected RCharacterStore createStore(final CharCaseData data) {
+		return createSerStore((RCharacter32Store)super.createStore(data),
+				RCharacter32Store::new );
+	}
+	
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RCharacter32StoreTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RCharacter32StoreTest.java
new file mode 100644
index 0000000..5cfeccc
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RCharacter32StoreTest.java
@@ -0,0 +1,44 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ # 
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ # 
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ # 
+ # Contributors:
+ #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import java.util.Arrays;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
+import org.eclipse.statet.rj.data.RCharacterStore;
+
+
+@NonNullByDefault
+public class RCharacter32StoreTest extends RCharacterStoreTest {
+	
+	
+	public RCharacter32StoreTest() {
+	}
+	
+	
+	@Override
+	protected RCharacterStore createStore(final CharCaseData data) {
+		final @Nullable String[] encoded= Arrays.copyOf(data.values, data.length);
+		for (int j= 0; j < data.length; j++) {
+			if (data.nas[j]) {
+				encoded[j]= null;
+			}
+		}
+		return new RCharacter32Store(encoded);
+	}
+	
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RCharacterFix64StoreTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RCharacterFix64StoreTest.java
new file mode 100644
index 0000000..321ae35
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RCharacterFix64StoreTest.java
@@ -0,0 +1,54 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ # 
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ # 
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ # 
+ # Contributors:
+ #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import static org.eclipse.statet.rj.data.impl.RCharacterFix64Store.SEGMENT_LENGTH;
+
+import java.util.Arrays;
+
+import org.eclipse.statet.jcommons.lang.NonNull;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
+import org.eclipse.statet.rj.data.RCharacterStore;
+
+
+@NonNullByDefault
+public class RCharacterFix64StoreTest extends RCharacterStoreTest {
+	
+	
+	public RCharacterFix64StoreTest() {
+	}
+	
+	
+	@Override
+	protected RCharacterStore createStore(final CharCaseData data) {
+		final int nSegments= getSegmentCount(data, SEGMENT_LENGTH);
+		final var values= new @Nullable String [nSegments] @NonNull[];
+		for (int i= 0, start= 0; i < values.length; i++) {
+			final int end= Math.min(start + SEGMENT_LENGTH, data.length);
+			final String[] encoded= Arrays.copyOfRange(data.values, start, end);
+			for (int j= 0; j < encoded.length; j++) {
+				if (data.nas[start + j]) {
+					encoded[j]= null;
+				}
+			}
+			values[i]= encoded;
+			start= end;
+		}
+		return new RCharacterFix64Store(values);
+	}
+	
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RCharacterStoreTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RCharacterStoreTest.java
new file mode 100644
index 0000000..e42fe7c
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RCharacterStoreTest.java
@@ -0,0 +1,290 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ # 
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ # 
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ # 
+ # Contributors:
+ #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.fail;
+
+import static org.eclipse.statet.rj.data.impl.AbstractRStore.DEFAULT_LONG_DATA_SEGMENT_LENGTH;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
+
+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.RObject;
+import org.eclipse.statet.rj.data.RStore;
+
+
+@NonNullByDefault
+public abstract class RCharacterStoreTest extends AbstractRStoreTest {
+	
+	
+	static class CharCaseData extends CaseData {
+		
+		final String[] values;
+		
+		
+		public CharCaseData(final String label, final String[] values, final boolean[] nas) {
+			super(label, nas);
+			assert (values.length == this.length);
+			assert (nas.length == this.length);
+			this.values= values;
+		}
+		
+		public CharCaseData(final String label, final String[] values) {
+			super(label, values.length);
+			assert (values.length == this.length);
+			this.values= values;
+		}
+		
+	}
+	
+	
+	private static final Map<String, Boolean> LOGI_STRINGS;
+	static {
+		final var map= new LinkedHashMap<String, Boolean>();
+		for (final String s : List.<String>of("T", "TRUE", "True", "true")) {
+			map.put(s, Boolean.TRUE);
+		}
+		for (final String s : List.<String>of("F", "FALSE", "False", "false")) {
+			map.put(s, Boolean.FALSE);
+		}
+		LOGI_STRINGS= map;
+	}
+	
+	
+	protected static final List<CharCaseData> DEFAULT_DATA_SOURCES;
+	static {
+		final var datas= new ArrayList<CharCaseData>();
+		
+		datas.add(new CharCaseData("empty", new @Nullable String[0]));
+		
+		datas.add(new CharCaseData("single-empty", new String[] { "" }));
+		datas.add(new CharCaseData("single-1", new String[] { "1" }));
+		datas.add(new CharCaseData("single", new String[] { "abcdefghijkl" }));
+		datas.add(new CharCaseData("single-NA", new String[] { null }, new boolean[] { true }));
+		
+		{	final String[] values= new String[LOGI_STRINGS.size() + 3];
+			final boolean[] nas= new boolean[values.length];
+			int i= 0;
+			for (final String string : LOGI_STRINGS.keySet()) {
+				values[i++]= string;
+			}
+			values[i++]= "TRue";
+			values[i++]= "falsE";
+			nas[i++]= true;
+			datas.add(new CharCaseData("logi", values, nas));
+		}
+		
+		{	final Random rand= new Random(16857);
+			final String[] values= new String[100000];
+			for (int i= 0; i < values.length; i++) {
+				values[i]= Integer.toString(rand.nextInt());
+			}
+			datas.add(new CharCaseData("rand100000", values));
+		}
+		if (isBigDataEnabled(64)) {
+			final Random rand= new Random(46);
+			final String[] values= new String[DEFAULT_LONG_DATA_SEGMENT_LENGTH * 2 + 13];
+			for (int i= 0; i < values.length; i++) {
+				values[i]= Integer.toHexString(rand.nextInt());
+			}
+			datas.add(new CharCaseData("randMultiSeg", values));
+		}
+		
+		DEFAULT_DATA_SOURCES= datas;
+	}
+	
+	
+	public RCharacterStoreTest() {
+	}
+	
+	
+	public static List<CharCaseData> provideCaseDatas() {
+		return new ArrayList<>(DEFAULT_DATA_SOURCES);
+	}
+	
+	protected abstract RCharacterStore createStore(final CharCaseData data);
+	
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void getStoreType(final CharCaseData data) {
+		final RCharacterStore store= createStore(data);
+		
+		assertEquals(RStore.CHARACTER, store.getStoreType());
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void getBaseVectorRClassName(final CharCaseData data) {
+		final RCharacterStore store= createStore(data);
+		
+		assertEquals(RObject.CLASSNAME_CHARACTER, store.getBaseVectorRClassName());
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void length(final CharCaseData data) {
+		final RCharacterStore store= createStore(data);
+		
+		checkLength(data, store);
+	}
+	
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void isNA(final CharCaseData data) {
+		final RCharacterStore store= createStore(data);
+		
+		checkIsNA(data, store);
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void isMissing(final CharCaseData data) {
+		final RCharacterStore store= createStore(data);
+		
+		checkIsMissingNonNum(data, store);
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	@SuppressWarnings("boxing")
+	public void getLogi(final CharCaseData data) {
+		final RCharacterStore store= createStore(data);
+		
+		for (int i= 0; i < data.length; i++) {
+			final int i0= i;
+			try {
+				if (data.nas[i0]) {
+					// undefined
+				}
+				else {
+					final Boolean logi= LOGI_STRINGS.get(data.values[i0]);
+					if (logi != null) {
+						final boolean expected= logi.booleanValue();
+						assertEquals(expected, store.getLogi(i0), storeDiffersAt(i0));
+						assertEquals(expected, store.getLogi((long)i0), storeDiffersAt(i0));
+					}
+					else {
+						assertThrows(NumberFormatException.class, () -> store.getLogi(i0), storeDiffersAt(i0));
+						assertThrows(NumberFormatException.class, () -> store.getLogi((long)i0), storeDiffersAt(i0));
+					}
+				}
+			}
+			catch (final NumberFormatException e) {
+				fail(storeDiffersAt(i0).get(), e);
+			}
+		}
+		assertIndexOutOfBounds(data, store::getLogi, store::getLogi);
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void getInt(final CharCaseData data) {
+		final RCharacterStore store= createStore(data);
+		
+		assertUnsupported(data, store::getInt, store::getInt);
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void getNum(final CharCaseData data) {
+		final RCharacterStore store= createStore(data);
+		
+		assertUnsupported(data, store::getNum, store::getNum);
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void getChar(final CharCaseData data) {
+		final RCharacterStore store= createStore(data);
+		
+		for (int i= 0; i < data.length; i++) {
+			final int i0= i;
+			if (data.nas[i0]) {
+				// undefined
+			}
+			else {
+				final String expected= data.values[i0];
+				assertEquals(expected, store.getChar(i0), storeDiffersAt(i0));
+				assertEquals(expected, store.getChar((long)i0), storeDiffersAt(i0));
+			}
+		}
+		assertIndexOutOfBounds(data, store::getChar, store::getChar);
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void getRaw(final CharCaseData data) {
+		final RCharacterStore store= createStore(data);
+		
+		assertUnsupported(data, store::getRaw, store::getRaw);
+	}
+	
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void get(final CharCaseData data) {
+		final RCharacterStore store= createStore(data);
+		
+		for (int i= 0; i < data.length; i++) {
+			final int i0= i;
+			if (data.nas[i0]) {
+				assertNull(store.get(i), storeDiffersAt(i0));
+			}
+			else {
+				final String expected= data.values[i0];
+				assertEquals(expected, store.get(i0));
+				assertEquals(expected, store.get((long)i0));
+			}
+		}
+		assertIndexOutOfBounds(data, store::get, store::get);
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void toArray(final CharCaseData data) {
+		final RCharacterStore store= createStore(data);
+		
+		final @Nullable String[] array= store.toArray();
+		
+		assertEquals(data.values.length, array.length);
+		
+		for (int i= 0; i < data.length; i++) {
+			final int i0= i;
+			if (data.nas[i0]) {
+				assertNull(store.get(i), arrayDiffersAt(i0));
+			}
+			else {
+				final String expected= data.values[i0];
+				assertEquals(expected, array[i], arrayDiffersAt(i0));
+			}
+		}
+	}
+	
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RComplexB32StoreSerTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RComplexB32StoreSerTest.java
new file mode 100644
index 0000000..30dc3a7
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RComplexB32StoreSerTest.java
@@ -0,0 +1,36 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ # 
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ # 
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ # 
+ # Contributors:
+ #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.rj.data.RComplexStore;
+
+
+@NonNullByDefault
+public class RComplexB32StoreSerTest extends RComplexB32StoreTest {
+	
+	
+	public RComplexB32StoreSerTest() {
+	}
+	
+	
+	@Override
+	protected RComplexStore createStore(final CplxCaseData data) {
+		return createSerStore((RComplexB32Store)super.createStore(data),
+				RComplexB32Store::new );
+	}
+	
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RComplexB32StoreTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RComplexB32StoreTest.java
new file mode 100644
index 0000000..f2a9bae
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RComplexB32StoreTest.java
@@ -0,0 +1,40 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ # 
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ # 
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ # 
+ # Contributors:
+ #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import java.util.Arrays;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.rj.data.RComplexStore;
+
+
+@NonNullByDefault
+public class RComplexB32StoreTest extends RComplexStoreTest {
+	
+	
+	public RComplexB32StoreTest() {
+	}
+	
+	
+	@Override
+	protected RComplexStore createStore(final CplxCaseData data) {
+		return new RComplexB32Store(
+				Arrays.copyOf(data.realValues, data.length),
+				Arrays.copyOf(data.imaginaryValues, data.length),
+				Arrays.copyOf(data.nas, data.length) );
+	}
+	
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RComplexBFix64StoreTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RComplexBFix64StoreTest.java
new file mode 100644
index 0000000..d86e946
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RComplexBFix64StoreTest.java
@@ -0,0 +1,51 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ # 
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ # 
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ # 
+ # Contributors:
+ #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import static org.eclipse.statet.rj.data.impl.RComplexBFix64Store.SEGMENT_LENGTH;
+
+import java.util.Arrays;
+
+import org.eclipse.statet.jcommons.lang.NonNull;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.rj.data.RComplexStore;
+
+
+@NonNullByDefault
+public class RComplexBFix64StoreTest extends RComplexStoreTest {
+	
+	
+	public RComplexBFix64StoreTest() {
+	}
+	
+	
+	@Override
+	protected RComplexStore createStore(final CplxCaseData data) {
+		final int nSegments= getSegmentCount(data, SEGMENT_LENGTH);
+		final var reValues= new double [nSegments] @NonNull[];
+		final var imValues= new double [nSegments] @NonNull[];
+		final var nas= new boolean [nSegments] @NonNull[];
+		for (int i= 0, start= 0; i < reValues.length; i++) {
+			final int end= Math.min(start + SEGMENT_LENGTH, data.length);
+			reValues[i]= Arrays.copyOfRange(data.realValues, start, end);
+			imValues[i]= Arrays.copyOfRange(data.imaginaryValues, start, end);
+			nas[i]= Arrays.copyOfRange(data.nas, start, end);
+			start= end;
+		}
+		return new RComplexBFix64Store(reValues, imValues, nas);
+	}
+	
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RComplexStoreTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RComplexStoreTest.java
new file mode 100644
index 0000000..2959445
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RComplexStoreTest.java
@@ -0,0 +1,313 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ # 
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ # 
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ # 
+ # Contributors:
+ #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import static org.eclipse.statet.rj.data.impl.AbstractRStore.DEFAULT_LONG_DATA_SEGMENT_LENGTH;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
+
+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.RComplexStore.Complex;
+import org.eclipse.statet.rj.data.RObject;
+import org.eclipse.statet.rj.data.RStore;
+
+
+@NonNullByDefault
+public abstract class RComplexStoreTest extends AbstractRStoreTest {
+	
+	
+	static class CplxCaseData extends CaseData {
+		
+		final double[] realValues;
+		final double[] imaginaryValues;
+		
+		
+		public CplxCaseData(final String label, final double[] realValues, final double[] imaginaryValues,
+				final boolean[] nas) {
+			super(label, nas);
+			assert (realValues.length == this.length);
+			assert (imaginaryValues.length == this.length);
+			this.realValues= realValues;
+			this.imaginaryValues= imaginaryValues;
+		}
+		
+		public CplxCaseData(final String label, final double[] realValues, final double[] imaginaryValues) {
+			super(label, realValues.length);
+			assert (realValues.length == this.length);
+			assert (imaginaryValues.length == this.length);
+			this.realValues= realValues;
+			this.imaginaryValues= imaginaryValues;
+		}
+		
+	}
+	
+	protected static final List<CplxCaseData> DEFAULT_DATA_SOURCES;
+	static {
+		final var datas= new ArrayList<CplxCaseData>();
+		
+		datas.add(new CplxCaseData("empty", new double[0], new double[0]));
+		
+		datas.add(new CplxCaseData("single-0", new double[] { 0 }, new double[] { 0 }));
+		datas.add(new CplxCaseData("single-1", new double[] { 1 }, new double[] { 0 }));
+		datas.add(new CplxCaseData("single-i1", new double[] { 0 }, new double[] { 1 }));
+		datas.add(new CplxCaseData("single-NA", new double[] { 0 }, new double[] { 0 }, new boolean[] { true }));
+		
+		{	final double[] realValues= new double[0xFF];
+			final double[] imaginaryValues= new double[realValues.length];
+			final boolean[] nas= new boolean[realValues.length];
+			int i= 0;
+			realValues[i++]= 0;
+			realValues[i++]= -0;
+			realValues[i++]= +1;
+			realValues[i++]= -1;
+			realValues[i++]= Double.MIN_NORMAL;
+			realValues[i++]= Double.MIN_VALUE;
+			realValues[i++]= Double.MAX_VALUE;
+			realValues[i++]= Double.POSITIVE_INFINITY;
+			realValues[i++]= -Double.NEGATIVE_INFINITY;
+			realValues[i++]= Double.NaN;
+			imaginaryValues[i++]= -0;
+			imaginaryValues[i++]= -1;
+			imaginaryValues[i++]= +1;
+			imaginaryValues[i++]= Double.MIN_NORMAL;
+			imaginaryValues[i++]= Double.MIN_VALUE;
+			imaginaryValues[i++]= -Double.MAX_VALUE;
+			imaginaryValues[i++]= Double.POSITIVE_INFINITY;
+			imaginaryValues[i++]= -Double.NEGATIVE_INFINITY;
+			nas[i++]= true;
+			
+			datas.add(new CplxCaseData("special", realValues, imaginaryValues, nas));
+		}
+		
+		{	final Random rand= new Random(16857);
+			final double[] realValues= new double[100000];
+			final double[] imaginaryValues= new double[realValues.length];
+			for (int i= 0; i < realValues.length; i++) {
+				realValues[i]= rand.nextDouble();
+				imaginaryValues[i]= rand.nextDouble();
+			}
+			datas.add(new CplxCaseData("rand100000", realValues, imaginaryValues));
+		}
+		if (isBigDataEnabled(24)) {
+			final Random rand= new Random(46);
+			final double[] realValues= new double[DEFAULT_LONG_DATA_SEGMENT_LENGTH * 2 + 13];
+			final double[] imaginaryValues= new double[DEFAULT_LONG_DATA_SEGMENT_LENGTH * 2 + 13];
+			for (int i= 0; i < realValues.length; i++) {
+				realValues[i]= rand.nextDouble();
+			}
+			datas.add(new CplxCaseData("randMultiSeg", realValues, imaginaryValues));
+		}
+		
+		DEFAULT_DATA_SOURCES= datas;
+	}
+	
+	
+	public RComplexStoreTest() {
+	}
+	
+	
+	public static List<CplxCaseData> provideCaseDatas() {
+		return new ArrayList<>(DEFAULT_DATA_SOURCES);
+	}
+	
+	protected abstract RComplexStore createStore(final CplxCaseData data);
+	
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void getStoreType(final CplxCaseData data) {
+		final RComplexStore store= createStore(data);
+		
+		assertEquals(RStore.COMPLEX, store.getStoreType());
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void getBaseVectorRClassName(final CplxCaseData data) {
+		final RComplexStore store= createStore(data);
+		
+		assertEquals(RObject.CLASSNAME_COMPLEX, store.getBaseVectorRClassName());
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void length(final CplxCaseData data) {
+		final RComplexStore store= createStore(data);
+		
+		checkLength(data, store);
+	}
+	
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void isNA(final CplxCaseData data) {
+		final RComplexStore store= createStore(data);
+		
+		checkIsNA(data, store);
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void isMissing(final CplxCaseData data) {
+		final RComplexStore store= createStore(data);
+		
+		for (int i= 0; i < data.length; i++) {
+			final int i0= i;
+			if (data.nas[i0]
+					|| Double.isNaN(data.realValues[i0]) || Double.isNaN(data.imaginaryValues[i0])) {
+				assertTrue(store.isMissing(i0), storeDiffersAt(i0));
+				assertTrue(store.isMissing((long)i0), storeDiffersAt(i0));
+			}
+			else {
+				assertFalse(store.isMissing(i0), storeDiffersAt(i0));
+				assertFalse(store.isMissing((long)i0), storeDiffersAt(i0));
+			}
+		}
+		assertIndexOutOfBounds(data, store::isMissing, store::isMissing);
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void getLogi(final CplxCaseData data) {
+		final RComplexStore store= createStore(data);
+		
+		assertUnsupported(data, store::getLogi, store::getLogi);
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void getInt(final CplxCaseData data) {
+		final RComplexStore store= createStore(data);
+		
+		assertUnsupported(data, store::getInt, store::getInt);
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void getNum(final CplxCaseData data) {
+		final RComplexStore store= createStore(data);
+		
+		assertUnsupported(data, store::getNum, store::getNum);
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void getCplx(final CplxCaseData data) {
+		final RComplexStore store= createStore(data);
+		
+		for (int i= 0; i < data.length; i++) {
+			final int i0= i;
+			if (data.nas[i0]) {
+				// undefined
+			}
+			else {
+				final double expectedRe= data.realValues[i0];
+				final double expectedIm= data.imaginaryValues[i0];
+				assertEquals(expectedRe, store.getCplxRe(i0), storeDiffersAt(i0));
+				assertEquals(expectedRe, store.getCplxRe((long)i0), storeDiffersAt(i0));
+				assertEquals(expectedIm, store.getCplxIm(i0), storeDiffersAt(i0));
+				assertEquals(expectedIm, store.getCplxIm((long)i0), storeDiffersAt(i0));
+			}
+		}
+		assertIndexOutOfBounds(data, store::getCplxRe, store::getCplxRe);
+		assertIndexOutOfBounds(data, store::getCplxIm, store::getCplxIm);
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void getChar(final CplxCaseData data) {
+		final RComplexStore store= createStore(data);
+		
+		for (int i= 0; i < data.length; i++) {
+			final int i0= i;
+			if (data.nas[i0]) {
+				// undefined
+			}
+			else {
+				final String reStr= Double.toString(data.realValues[i0]).replace("Infinity", "Inf");
+				final String imStr= Double.toString(data.imaginaryValues[i0]).replace("Infinity", "Inf");
+				final String expected= (imStr.charAt(0) != '-') ?
+						(reStr + '+' + imStr + 'i') :
+						(reStr + imStr + 'i');
+				assertEquals(expected, store.getChar(i0), storeDiffersAt(i0));
+				assertEquals(expected, store.getChar((long)i0), storeDiffersAt(i0));
+			}
+		}
+		assertIndexOutOfBounds(data, store::getChar, store::getChar);
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void getRaw(final CplxCaseData data) {
+		final RComplexStore store= createStore(data);
+		
+		assertUnsupported(data, store::getRaw, store::getRaw);
+	}
+	
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void get(final CplxCaseData data) {
+		final RComplexStore store= createStore(data);
+		
+		for (int i= 0; i < data.length; i++) {
+			final int i0= i;
+			if (data.nas[i0]) {
+				assertNull(store.get(i0), storeDiffersAt(i0));
+			}
+			else {
+				final Complex expected= new Complex(data.realValues[i0], data.imaginaryValues[i0]);
+				assertEquals(expected, store.get(i0), storeDiffersAt(i0));
+				assertEquals(expected, store.get((long)i0), storeDiffersAt(i0));
+			}
+		}
+		assertIndexOutOfBounds(data, store::get, store::get);
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void toArray(final CplxCaseData data) {
+		final RComplexStore store= createStore(data);
+		
+		final @Nullable Complex[] array= store.toArray();
+		
+		assertEquals(data.realValues.length, array.length);
+		
+		for (int i= 0; i < data.length; i++) {
+			final int i0= i;
+			if (data.nas[i0]) {
+				assertNull(array[i0], arrayDiffersAt(i0));
+			}
+			else {
+				final Complex expected= new Complex(data.realValues[i0], data.imaginaryValues[i0]);
+				assertEquals(expected, array[i0], arrayDiffersAt(i0));
+			}
+		}
+	}
+	
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RInteger32StoreSerTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RInteger32StoreSerTest.java
new file mode 100644
index 0000000..7726d52
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RInteger32StoreSerTest.java
@@ -0,0 +1,36 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ # 
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ # 
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ # 
+ # Contributors:
+ #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.rj.data.RIntegerStore;
+
+
+@NonNullByDefault
+public class RInteger32StoreSerTest extends RInteger32StoreTest {
+	
+	
+	public RInteger32StoreSerTest() {
+	}
+	
+	
+	@Override
+	protected RIntegerStore createStore(final IntCaseData data) {
+		return createSerStore((RInteger32Store)super.createStore(data),
+				RInteger32Store::new );
+	}
+	
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RInteger32StoreTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RInteger32StoreTest.java
new file mode 100644
index 0000000..9dfc012
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RInteger32StoreTest.java
@@ -0,0 +1,39 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ # 
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ # 
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ # 
+ # Contributors:
+ #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import java.util.Arrays;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.rj.data.RIntegerStore;
+
+
+@NonNullByDefault
+public class RInteger32StoreTest extends RIntegerStoreTest {
+	
+	
+	public RInteger32StoreTest() {
+	}
+	
+	
+	@Override
+	protected RIntegerStore createStore(final IntCaseData data) {
+		return new RInteger32Store(
+				Arrays.copyOf(data.values, data.length),
+				Arrays.copyOf(data.nas, data.length) );
+	}
+	
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RIntegerFix64StoreTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RIntegerFix64StoreTest.java
new file mode 100644
index 0000000..c6f3429
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RIntegerFix64StoreTest.java
@@ -0,0 +1,49 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ # 
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ # 
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ # 
+ # Contributors:
+ #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import static org.eclipse.statet.rj.data.impl.RIntegerFix64Store.SEGMENT_LENGTH;
+
+import java.util.Arrays;
+
+import org.eclipse.statet.jcommons.lang.NonNull;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.rj.data.RIntegerStore;
+
+
+@NonNullByDefault
+public class RIntegerFix64StoreTest extends RIntegerStoreTest {
+	
+	
+	public RIntegerFix64StoreTest() {
+	}
+	
+	
+	@Override
+	protected RIntegerStore createStore(final IntCaseData data) {
+		final int nSegments= getSegmentCount(data, SEGMENT_LENGTH);
+		final var values= new int [nSegments] @NonNull[];
+		final var nas= new boolean [nSegments] @NonNull[];
+		for (int i= 0, start= 0; i < values.length; i++) {
+			final int end= Math.min(start + SEGMENT_LENGTH, data.length);
+			values[i]= Arrays.copyOfRange(data.values, start, end);
+			nas[i]= Arrays.copyOfRange(data.nas, start, end);
+			start= end;
+		}
+		return new RIntegerFix64Store(values, nas);
+	}
+	
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RIntegerStoreTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RIntegerStoreTest.java
new file mode 100644
index 0000000..c5fc5bc
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RIntegerStoreTest.java
@@ -0,0 +1,302 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ # 
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ # 
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ # 
+ # Contributors:
+ #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+
+import static org.eclipse.statet.rj.data.impl.AbstractRStore.DEFAULT_LONG_DATA_SEGMENT_LENGTH;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
+
+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.RObject;
+import org.eclipse.statet.rj.data.RStore;
+
+
+@NonNullByDefault
+public abstract class RIntegerStoreTest extends AbstractRStoreTest {
+	
+	
+	static class IntCaseData extends CaseData {
+		
+		final int[] values;
+		
+		
+		public IntCaseData(final String label, final int[] values, final boolean[] nas) {
+			super(label, nas);
+			assert (values.length == this.length);
+			assert (nas.length == this.length);
+			this.values= values;
+		}
+		
+		public IntCaseData(final String label, final int[] values) {
+			super(label, values.length);
+			assert (values.length == this.length);
+			this.values= values;
+		}
+		
+	}
+	
+	protected static final List<IntCaseData> DEFAULT_DATA_SOURCES;
+	static {
+		final var datas= new ArrayList<IntCaseData>();
+		
+		datas.add(new IntCaseData("empty", new int[0]));
+		
+		datas.add(new IntCaseData("single-0", new int[] { 0 }));
+		datas.add(new IntCaseData("single-1", new int[] { 1 }));
+		datas.add(new IntCaseData("single-MAX", new int[] { RIntegerStore.MIN_INT }));
+		datas.add(new IntCaseData("single-MIN", new int[] { RIntegerStore.MAX_INT }));
+		datas.add(new IntCaseData("single-NA", new int[] { 0 }, new boolean[] { true }));
+		
+		{	final int[] values= new int[0x1FF];
+			for (int i= 0; i < values.length; i++) {
+				values[i]= i - 0xFF;
+			}
+			datas.add(new IntCaseData("seq", values));
+		}
+		{	final int[] values= new int[0x0FF];
+			final boolean[] nas= new boolean[values.length];
+			int i= 0;
+			values[i++]= 0;
+			values[i++]= RIntegerStore.MIN_INT;
+			values[i++]= RIntegerStore.MAX_INT;
+			nas[i++]= true;
+			datas.add(new IntCaseData("special", values, nas));
+		}
+		
+		{	final Random rand= new Random(16857);
+			final int[] values= new int[100000];
+			for (int i= 0; i < values.length; i++) {
+				values[i]= rand.nextInt();
+				if (values[i] == Integer.MIN_VALUE) {
+					values[i]= 0;
+				}
+			}
+			datas.add(new IntCaseData("rand100000", values));
+		}
+		if (isBigDataEnabled(4)) {
+			final Random rand= new Random(46);
+			final int[] values= new int[DEFAULT_LONG_DATA_SEGMENT_LENGTH * 2 + 13];
+			for (int i= 0; i < values.length; i++) {
+				values[i]= rand.nextInt();
+				if (values[i] == Integer.MIN_VALUE) {
+					values[i]= 0;
+				}
+			}
+			datas.add(new IntCaseData("randMultiSeg", values));
+		}
+		
+		DEFAULT_DATA_SOURCES= datas;
+	}
+	
+	
+	public RIntegerStoreTest() {
+	}
+	
+	
+	public static List<IntCaseData> provideCaseDatas() {
+		return new ArrayList<>(DEFAULT_DATA_SOURCES);
+	}
+	
+	protected abstract RIntegerStore createStore(final IntCaseData data);
+	
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void getStoreType(final IntCaseData data) {
+		final RIntegerStore store= createStore(data);
+		
+		assertEquals(RStore.INTEGER, store.getStoreType());
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void getBaseVectorRClassName(final IntCaseData data) {
+		final RIntegerStore store= createStore(data);
+		
+		assertEquals(RObject.CLASSNAME_INTEGER, store.getBaseVectorRClassName());
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void length(final IntCaseData data) {
+		final RIntegerStore store= createStore(data);
+		
+		checkLength(data, store);
+	}
+	
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void isNA(final IntCaseData data) {
+		final RIntegerStore store= createStore(data);
+		
+		checkIsNA(data, store);
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void isMissing(final IntCaseData data) {
+		final RIntegerStore store= createStore(data);
+		
+		checkIsMissingNonNum(data, store);
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	@SuppressWarnings("boxing")
+	public void getLogi(final IntCaseData data) {
+		final RIntegerStore store= createStore(data);
+		
+		for (int i= 0; i < data.length; i++) {
+			final int i0= i;
+			if (data.nas[i0]) {
+				// undefined
+			}
+			else {
+				final Boolean expected= Boolean.valueOf(data.values[i0] != 0);
+				assertEquals(expected, store.getLogi(i0));
+				assertEquals(expected, store.getLogi((long)i0));
+			}
+		}
+		assertIndexOutOfBounds(data, store::getLogi, store::getLogi);
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void getInt(final IntCaseData data) {
+		final RIntegerStore store= createStore(data);
+		
+		for (int i= 0; i < data.length; i++) {
+			final int i0= i;
+			if (data.nas[i0]) {
+				// undefined
+			}
+			else {
+				final int expected= data.values[i0];
+				assertEquals(expected, store.getInt(i0));
+				assertEquals(expected, store.getInt((long)i0));
+			}
+		}
+		assertIndexOutOfBounds(data, store::getInt, store::getInt);
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void getNum(final IntCaseData data) {
+		final RIntegerStore store= createStore(data);
+		
+		for (int i= 0; i < data.length; i++) {
+			final int i0= i;
+			if (data.nas[i0]) {
+				// undefined
+			}
+			else {
+				final double expected= data.values[i0];
+				assertEquals(expected, store.getNum(i0));
+				assertEquals(expected, store.getNum((long)i0));
+			}
+		}
+		assertIndexOutOfBounds(data, store::getNum, store::getNum);
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void getChar(final IntCaseData data) {
+		final RIntegerStore store= createStore(data);
+		
+		for (int i= 0; i < data.length; i++) {
+			final int i0= i;
+			if (data.nas[i0]) {
+				// undefined
+			}
+			else {
+				final String expected= Integer.toString(data.values[i0]);
+				assertEquals(expected, store.getChar(i0));
+				assertEquals(expected, store.getChar((long)i0));
+			}
+		}
+		assertIndexOutOfBounds(data, store::getChar, store::getChar);
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void getRaw(final IntCaseData data) {
+		final RIntegerStore store= createStore(data);
+		
+		for (int i= 0; i < data.length; i++) {
+			final int i0= i;
+			if (data.nas[i0]) {
+				// undefined
+			}
+			else if (data.values[i0] >= 0 && data.values[i0] < 0xFF) {
+				final byte expected= (byte)(data.values[i0] & 0xFF);
+				assertEquals(expected, store.getRaw(i0));
+				assertEquals(expected, store.getRaw((long)i0));
+			}
+		}
+		assertIndexOutOfBounds(data, store::getRaw, store::getRaw);
+	}
+	
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void get(final IntCaseData data) {
+		final RIntegerStore store= createStore(data);
+		
+		for (int i= 0; i < data.length; i++) {
+			final int i0= i;
+			if (data.nas[i0]) {
+				assertNull(store.get(i0), storeDiffersAt(i0));
+			}
+			else {
+				final Integer expected= Integer.valueOf(data.values[i0]);
+				assertEquals(expected, store.get(i0));
+				assertEquals(expected, store.get((long)i0));
+			}
+		}
+		assertIndexOutOfBounds(data, store::get, store::get);
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void toArray(final IntCaseData data) {
+		final RIntegerStore store= createStore(data);
+		
+		final @Nullable Integer[] array= store.toArray();
+		assertEquals(data.values.length, array.length);
+		for (int i= 0; i < data.length; i++) {
+			final int i0= i;
+			if (data.nas[i0]) {
+				assertNull(store.get(i0), storeDiffersAt(i0));
+			}
+			else {
+				final Integer expected= Integer.valueOf(data.values[i]);
+				assertEquals(expected, array[i], arrayDiffersAt(i));
+			}
+		}
+	}
+	
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RLogicalByte32StoreSerTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RLogicalByte32StoreSerTest.java
new file mode 100644
index 0000000..af87a0b
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RLogicalByte32StoreSerTest.java
@@ -0,0 +1,36 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ # 
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ # 
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ # 
+ # Contributors:
+ #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.rj.data.RLogicalStore;
+
+
+@NonNullByDefault
+public class RLogicalByte32StoreSerTest extends RLogicalByte32StoreTest {
+	
+	
+	public RLogicalByte32StoreSerTest() {
+	}
+	
+	
+	@Override
+	protected RLogicalStore createStore(final LogiCaseData data) {
+		return createSerStore((RLogicalByte32Store)super.createStore(data),
+				RLogicalByte32Store::new );
+	}
+	
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RLogicalByte32StoreTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RLogicalByte32StoreTest.java
new file mode 100644
index 0000000..ea25310
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RLogicalByte32StoreTest.java
@@ -0,0 +1,39 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ # 
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ # 
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ # 
+ # Contributors:
+ #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import java.util.Arrays;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.rj.data.RLogicalStore;
+
+
+@NonNullByDefault
+public class RLogicalByte32StoreTest extends RLogicalStoreTest {
+	
+	
+	public RLogicalByte32StoreTest() {
+	}
+	
+	
+	@Override
+	protected RLogicalStore createStore(final LogiCaseData data) {
+		return new RLogicalByte32Store(
+				Arrays.copyOf(data.values, data.length),
+				Arrays.copyOf(data.nas, data.length) );
+	}
+	
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RLogicalByteFix64StoreTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RLogicalByteFix64StoreTest.java
new file mode 100644
index 0000000..9482e6f
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RLogicalByteFix64StoreTest.java
@@ -0,0 +1,49 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ # 
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ # 
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ # 
+ # Contributors:
+ #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import static org.eclipse.statet.rj.data.impl.RLogicalByteFix64Store.SEGMENT_LENGTH;
+
+import java.util.Arrays;
+
+import org.eclipse.statet.jcommons.lang.NonNull;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.rj.data.RLogicalStore;
+
+
+@NonNullByDefault
+public class RLogicalByteFix64StoreTest extends RLogicalStoreTest {
+	
+	
+	public RLogicalByteFix64StoreTest() {
+	}
+	
+	
+	@Override
+	protected RLogicalStore createStore(final LogiCaseData data) {
+		final int nSegments= getSegmentCount(data, SEGMENT_LENGTH);
+		final var values= new boolean [nSegments] @NonNull[];
+		final var nas= new boolean [nSegments] @NonNull[];
+		for (int i= 0, start= 0; i < values.length; i++) {
+			final int end= Math.min(start + SEGMENT_LENGTH, data.length);
+			values[i]= Arrays.copyOfRange(data.values, start, end);
+			nas[i]= Arrays.copyOfRange(data.nas, start, end);
+			start= end;
+		}
+		return new RLogicalByteFix64Store(values, nas);
+	}
+	
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RLogicalInt32StoreTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RLogicalInt32StoreTest.java
new file mode 100644
index 0000000..e9a9d6e
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RLogicalInt32StoreTest.java
@@ -0,0 +1,39 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ # 
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ # 
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ # 
+ # Contributors:
+ #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import java.util.Arrays;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.rj.data.RLogicalStore;
+
+
+@NonNullByDefault
+public class RLogicalInt32StoreTest extends RLogicalStoreTest {
+	
+	
+	public RLogicalInt32StoreTest() {
+	}
+	
+	
+	@Override
+	protected RLogicalStore createStore(final LogiCaseData data) {
+		return new RLogicalInt32Store(
+				Arrays.copyOf(data.values, data.length),
+				Arrays.copyOf(data.nas, data.length) );
+	}
+	
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RLogicalStoreTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RLogicalStoreTest.java
new file mode 100644
index 0000000..7234725
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RLogicalStoreTest.java
@@ -0,0 +1,292 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ # 
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ # 
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ # 
+ # Contributors:
+ #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+
+import static org.eclipse.statet.rj.data.impl.AbstractRStore.DEFAULT_LONG_DATA_SEGMENT_LENGTH;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
+import org.eclipse.statet.rj.data.RLogicalStore;
+import org.eclipse.statet.rj.data.RObject;
+import org.eclipse.statet.rj.data.RStore;
+
+
+@NonNullByDefault
+public abstract class RLogicalStoreTest extends AbstractRStoreTest {
+	
+	
+	static class LogiCaseData extends CaseData {
+		
+		final boolean[] values;
+		
+		
+		public LogiCaseData(final String label, final boolean[] values, final boolean[] nas) {
+			super(label, nas);
+			assert (values.length == this.length);
+			assert (nas.length == this.length);
+			this.values= values;
+		}
+		
+		public LogiCaseData(final String label, final boolean[] values) {
+			super(label, values.length);
+			assert (values.length == this.length);
+			this.values= values;
+		}
+		
+	}
+	
+	protected static final List<LogiCaseData> DEFAULT_DATA_SOURCES;
+	static {
+		final var datas= new ArrayList<LogiCaseData>();
+		
+		datas.add(new LogiCaseData("empty", new boolean[0]));
+		
+		datas.add(new LogiCaseData("single-TRUE", new boolean[] { true }));
+		datas.add(new LogiCaseData("single-FALSE", new boolean[] { false }));
+		datas.add(new LogiCaseData("single-NA", new boolean[] { false }, new boolean[] { true }));
+		
+		{	final boolean[] values= new boolean[0xFF];
+			final boolean[] nas= new boolean[values.length];
+			int i= 0;
+			values[i++]= false;
+			values[i++]= true;
+			nas[i++]= true;
+			for (; i < values.length; i++) {
+				values[i]= (i % 2 == 0);
+			}
+			datas.add(new LogiCaseData("special", values, nas));
+		}
+		
+		{	final Random rand= new Random(16857);
+			final boolean[] values= new boolean[100000];
+			for (int i= 0; i < values.length; i++) {
+				values[i]= rand.nextBoolean();
+			}
+			datas.add(new LogiCaseData("rand100000", values));
+		}
+		if (isBigDataEnabled(1)) {
+			final Random rand= new Random(46);
+			final boolean[] values= new boolean[DEFAULT_LONG_DATA_SEGMENT_LENGTH * 2 + 13];
+			for (int i= 0; i < values.length; i++) {
+				values[i]= rand.nextBoolean();
+			}
+			datas.add(new LogiCaseData("randMultiSeg", values));
+		}
+		
+		DEFAULT_DATA_SOURCES= datas;
+	}
+	
+	
+	public RLogicalStoreTest() {
+	}
+	
+	
+	public static List<LogiCaseData> provideCaseDatas() {
+		return new ArrayList<>(DEFAULT_DATA_SOURCES);
+	}
+	
+	protected abstract RLogicalStore createStore(final LogiCaseData data);
+	
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void getStoreType(final LogiCaseData data) {
+		final RLogicalStore store= createStore(data);
+		
+		assertEquals(RStore.LOGICAL, store.getStoreType());
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void getBaseVectorRClassName(final LogiCaseData data) {
+		final RLogicalStore store= createStore(data);
+		
+		assertEquals(RObject.CLASSNAME_LOGICAL, store.getBaseVectorRClassName());
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void length(final LogiCaseData data) {
+		final RLogicalStore store= createStore(data);
+		
+		checkLength(data, store);
+	}
+	
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void isNA(final LogiCaseData data) {
+		final RLogicalStore store= createStore(data);
+		
+		checkIsNA(data, store);
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void isMissing(final LogiCaseData data) {
+		final RLogicalStore store= createStore(data);
+		
+		checkIsMissingNonNum(data, store);
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	@SuppressWarnings("boxing")
+	public void getLogi(final LogiCaseData data) {
+		final RLogicalStore store= createStore(data);
+		
+		for (int i= 0; i < data.length; i++) {
+			final int i0= i;
+			if (data.nas[i0]) {
+				// undefined
+			}
+			else {
+				final Boolean expected= Boolean.valueOf(data.values[i0]);
+				assertEquals(expected, store.getLogi(i0));
+				assertEquals(expected, store.getLogi((long)i0));
+			}
+		}
+		assertIndexOutOfBounds(data, store::getLogi, store::getLogi);
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void getInt(final LogiCaseData data) {
+		final RLogicalStore store= createStore(data);
+		
+		for (int i= 0; i < data.length; i++) {
+			final int i0= i;
+			if (data.nas[i0]) {
+				// undefined
+			}
+			else {
+				final int expected= (data.values[i0]) ? 1 : 0;
+				assertEquals(expected, store.getInt(i0));
+				assertEquals(expected, store.getInt((long)i0));
+			}
+		}
+		assertIndexOutOfBounds(data, store::getInt, store::getInt);
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void getNum(final LogiCaseData data) {
+//		final RLogicalStore store= createStore(data);
+//		
+//		for (int i= 0; i < data.length; i++) {
+//			final int i0= i;
+//			if (data.nas[i0]) {
+//				// undefined
+//			}
+//			else {
+//				final double expected= (data.values[i0]) ? 1.0 : 0.0;
+//				assertEquals(expected, store.getNum(i0));
+//				assertEquals(expected, store.getNum((long)i0));
+//			}
+//		}
+//		assertIndexOutOfBounds(data, store::getNum, store::getNum);
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void getChar(final LogiCaseData data) {
+		final RLogicalStore store= createStore(data);
+		
+		for (int i= 0; i < data.length; i++) {
+			final int i0= i;
+			if (data.nas[i0]) {
+				// undefined
+			}
+			else {
+				final String expected= (data.values[i0]) ? "TRUE" : "FALSE";
+				assertEquals(expected, store.getChar(i0), storeDiffersAt(i0));
+				assertEquals(expected, store.getChar((long)i0), storeDiffersAt(i0));
+			}
+		}
+		assertIndexOutOfBounds(data, store::getChar, store::getChar);
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void getRaw(final LogiCaseData data) {
+		final RLogicalStore store= createStore(data);
+		
+		for (int i= 0; i < data.length; i++) {
+			final int i0= i;
+			if (data.nas[i0]) {
+				// undefined
+			}
+			else {
+				final byte expected= (data.values[i0]) ? (byte)1 : (byte)0;
+				assertEquals(expected, store.getRaw(i0), storeDiffersAt(i0));
+				assertEquals(expected, store.getRaw((long)i0), storeDiffersAt(i0));
+			}
+		}
+		assertIndexOutOfBounds(data, store::getRaw, store::getRaw);
+	}
+	
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void get(final LogiCaseData data) {
+		final RLogicalStore store= createStore(data);
+		
+		for (int i= 0; i < data.length; i++) {
+			final int i0= i;
+			if (data.nas[i0]) {
+				assertNull(store.get(i0), storeDiffersAt(i0));
+			}
+			else {
+				final Boolean expected= Boolean.valueOf(data.values[i0]);
+				assertEquals(expected, store.get(i0));
+				assertEquals(expected, store.get((long)i0));
+			}
+		}
+		assertIndexOutOfBounds(data, store::get, store::get);
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void toArray(final LogiCaseData data) {
+		final RLogicalStore store= createStore(data);
+		
+		final @Nullable Boolean[] array= store.toArray();
+		
+		assertEquals(data.values.length, array.length);
+		
+		for (int i= 0; i < data.length; i++) {
+			final int i0= i;
+			if (data.nas[i0]) {
+				assertNull(array[i0], arrayDiffersAt(i0));
+			}
+			else {
+				final Boolean expected= Boolean.valueOf(data.values[i0]);
+				assertEquals(expected, array[i0], arrayDiffersAt(i0));
+			}
+		}
+	}
+	
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RNumericB32StoreSerTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RNumericB32StoreSerTest.java
new file mode 100644
index 0000000..7e42312
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RNumericB32StoreSerTest.java
@@ -0,0 +1,36 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ # 
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ # 
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ # 
+ # Contributors:
+ #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.rj.data.RNumericStore;
+
+
+@NonNullByDefault
+public class RNumericB32StoreSerTest extends RNumericB32StoreTest {
+	
+	
+	public RNumericB32StoreSerTest() {
+	}
+	
+	
+	@Override
+	protected RNumericStore createStore(final NumCaseData data) {
+		return createSerStore((RNumericB32Store)super.createStore(data),
+				RNumericB32Store::new );
+	}
+	
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RNumericB32StoreTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RNumericB32StoreTest.java
new file mode 100644
index 0000000..de3bfda
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RNumericB32StoreTest.java
@@ -0,0 +1,39 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ # 
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ # 
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ # 
+ # Contributors:
+ #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import java.util.Arrays;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.rj.data.RNumericStore;
+
+
+@NonNullByDefault
+public class RNumericB32StoreTest extends RNumericStoreTest {
+	
+	
+	public RNumericB32StoreTest() {
+	}
+	
+	
+	@Override
+	protected RNumericStore createStore(final NumCaseData data) {
+		return new RNumericB32Store(
+				Arrays.copyOf(data.values, data.length),
+				Arrays.copyOf(data.nas, data.length) );
+	}
+	
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RNumericBFix64StoreTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RNumericBFix64StoreTest.java
new file mode 100644
index 0000000..6bb64b7
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RNumericBFix64StoreTest.java
@@ -0,0 +1,49 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ # 
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ # 
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ # 
+ # Contributors:
+ #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import static org.eclipse.statet.rj.data.impl.RNumericBFix64Store.SEGMENT_LENGTH;
+
+import java.util.Arrays;
+
+import org.eclipse.statet.jcommons.lang.NonNull;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.rj.data.RNumericStore;
+
+
+@NonNullByDefault
+public class RNumericBFix64StoreTest extends RNumericStoreTest {
+	
+	
+	public RNumericBFix64StoreTest() {
+	}
+	
+	
+	@Override
+	protected RNumericStore createStore(final NumCaseData data) {
+		final int nSegments= getSegmentCount(data, SEGMENT_LENGTH);
+		final var values= new double [nSegments] @NonNull[];
+		final var nas= new boolean [nSegments] @NonNull[];
+		for (int i= 0, start= 0; i < values.length; i++) {
+			final int end= Math.min(start + SEGMENT_LENGTH, data.length);
+			values[i]= Arrays.copyOfRange(data.values, start, end);
+			nas[i]= Arrays.copyOfRange(data.nas, start, end);
+			start= end;
+		}
+		return new RNumericBFix64Store(values, nas);
+	}
+	
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RNumericStoreTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RNumericStoreTest.java
new file mode 100644
index 0000000..f07ed2e
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RNumericStoreTest.java
@@ -0,0 +1,344 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ # 
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ # 
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ # 
+ # Contributors:
+ #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
+
+import static org.eclipse.statet.rj.data.impl.AbstractRStore.DEFAULT_LONG_DATA_SEGMENT_LENGTH;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
+
+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.RNumericStore;
+import org.eclipse.statet.rj.data.RObject;
+import org.eclipse.statet.rj.data.RStore;
+
+
+@NonNullByDefault
+public abstract class RNumericStoreTest extends AbstractRStoreTest {
+	
+	
+	static class NumCaseData extends CaseData {
+		
+		final double[] values;
+		
+		
+		public NumCaseData(final String label, final double[] values, final boolean[] nas) {
+			super(label, nas);
+			assert (values.length == this.length);
+			assert (nas.length == this.length);
+			this.values= values;
+		}
+		
+		public NumCaseData(final String label, final double[] values) {
+			super(label, values.length);
+			assert (values.length == this.length);
+			this.values= values;
+		}
+		
+	}
+	
+	protected static final List<NumCaseData> DEFAULT_DATA_SOURCES;
+	static {
+		final var datas= new ArrayList<NumCaseData>();
+		
+		datas.add(new NumCaseData("empty", new double[0]));
+		
+		datas.add(new NumCaseData("single-0", new double[] { 0 }));
+		datas.add(new NumCaseData("single-1", new double[] { 1 }));
+		datas.add(new NumCaseData("single-Min", new double[] { Double.MIN_VALUE }));
+		datas.add(new NumCaseData("single-Max", new double[] { Double.MAX_VALUE }));
+		datas.add(new NumCaseData("single-NA", new double[] { 0 }, new boolean[] { true }));
+		
+		{	final double[] values= new double[0x1FF];
+			for (int i= 0; i < values.length; i++) {
+				values[i]= i - 0xFF;
+			}
+			datas.add(new NumCaseData("seq", values));
+		}
+		{	final double[] values= new double[0xFF];
+			final boolean[] nas= new boolean[values.length];
+			int i= 0;
+			values[i++]= 0;
+			values[i++]= -0;
+			values[i++]= +1;
+			values[i++]= -1;
+			values[i++]= Double.MIN_NORMAL;
+			values[i++]= Double.MIN_VALUE;
+			values[i++]= Double.MAX_VALUE;
+			values[i++]= Double.POSITIVE_INFINITY;
+			values[i++]= -Double.NEGATIVE_INFINITY;
+			values[i++]= Double.NaN;
+			nas[i++]= true;
+			datas.add(new NumCaseData("special", values, nas));
+		}
+		
+		{	final Random rand= new Random(16857);
+			final double[] values= new double[100000];
+			for (int i= 0; i < values.length; i++) {
+				values[i]= rand.nextDouble();
+			}
+			datas.add(new NumCaseData("rand100000", values));
+		}
+		if (isBigDataEnabled(8)) {
+			final Random rand= new Random(46);
+			final double[] values= new double[DEFAULT_LONG_DATA_SEGMENT_LENGTH * 2 + 13];
+			for (int i= 0; i < values.length; i++) {
+				values[i]= rand.nextDouble();
+			}
+			datas.add(new NumCaseData("randMultiSeg", values));
+		}
+		
+		DEFAULT_DATA_SOURCES= datas;
+	}
+	
+	
+	public RNumericStoreTest() {
+	}
+	
+	
+	public static List<NumCaseData> provideCaseDatas() {
+		return new ArrayList<>(DEFAULT_DATA_SOURCES);
+	}
+	
+	protected abstract RNumericStore createStore(final NumCaseData data);
+	
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void getStoreType(final NumCaseData data) {
+		final RNumericStore store= createStore(data);
+		
+		assertEquals(RStore.NUMERIC, store.getStoreType());
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void getBaseVectorRClassName(final NumCaseData data) {
+		final RNumericStore store= createStore(data);
+		
+		assertEquals(RObject.CLASSNAME_NUMERIC, store.getBaseVectorRClassName());
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void length(final NumCaseData data) {
+		final RNumericStore store= createStore(data);
+		
+		checkLength(data, store);
+	}
+	
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void isNA(final NumCaseData data) {
+		final RNumericStore store= createStore(data);
+		
+		checkIsNA(data, store);
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void isMissing(final NumCaseData data) {
+		final RNumericStore store= createStore(data);
+		
+		for (int i= 0; i < data.length; i++) {
+			final int i0= i;
+			if (data.nas[i0]
+					|| Double.isNaN(data.values[i0])) {
+				assertTrue(store.isMissing(i0), storeDiffersAt(i0));
+				assertTrue(store.isMissing((long)i0), storeDiffersAt(i0));
+			}
+			else {
+				assertFalse(store.isMissing(i0), storeDiffersAt(i0));
+				assertFalse(store.isMissing((long)i0), storeDiffersAt(i0));
+			}
+		}
+		assertIndexOutOfBounds(data, store::isMissing, store::isMissing);
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	@SuppressWarnings("boxing")
+	public void getLogi(final NumCaseData data) {
+		final RNumericStore store= createStore(data);
+		
+		for (int i= 0; i < data.length; i++) {
+			final int i0= i;
+			try {
+				if (data.nas[i0]) {
+					// undefined
+				}
+				else {
+					final Boolean expected= Boolean.valueOf(data.values[i0] != 0);
+					assertEquals(expected, store.getLogi(i0), storeDiffersAt(i0));
+					assertEquals(expected, store.getLogi((long)i0), storeDiffersAt(i0));
+				}
+			}
+			catch (final NumberFormatException e) {
+				fail(storeDiffersAt(i0).get(), e);
+			}
+		}
+		assertIndexOutOfBounds(data, store::getLogi, store::getLogi);
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void getInt(final NumCaseData data) {
+		final RNumericStore store= createStore(data);
+		
+		for (int i= 0; i < data.length; i++) {
+			final int i0= i;
+			try {
+				if (data.nas[i0]) {
+					// undefined
+				}
+				else if (data.values[i0] >= RIntegerStore.MIN_INT && data.values[i0] <= RIntegerStore.MAX_INT) {
+					final int expected= (int)data.values[i0];
+					assertEquals(expected, store.getInt(i0), storeDiffersAt(i0));
+					assertEquals(expected, store.getInt((long)i0), storeDiffersAt(i0));
+				}
+				else {
+					// ?
+				}
+			}
+			catch (final NumberFormatException e) {
+				fail(storeDiffersAt(i0).get(), e);
+			}
+		}
+		assertIndexOutOfBounds(data, store::getInt, store::getInt);
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void getNum(final NumCaseData data) {
+		final RNumericStore store= createStore(data);
+		
+		for (int i= 0; i < data.length; i++) {
+			final int i0= i;
+			if (data.nas[i0]) {
+				// undefined
+			}
+			else {
+				final double expected= data.values[i0];
+				assertEquals(expected, store.getNum(i0), storeDiffersAt(i0));
+				assertEquals(expected, store.getNum((long)i0), storeDiffersAt(i0));
+			}
+		}
+		assertIndexOutOfBounds(data, store::getNum, store::getNum);
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void getCplx(final NumCaseData data) {
+		final RNumericStore store= createStore(data);
+		
+		for (int i= 0; i < data.length; i++) {
+			final int i0= i;
+			if (data.nas[i0]) {
+				// undefined
+			}
+			else {
+				final double expectedRe= data.values[i0];
+				assertEquals(expectedRe, store.getCplxRe(i0), storeDiffersAt(i0));
+				assertEquals(expectedRe, store.getCplxRe((long)i0), storeDiffersAt(i0));
+				assertEquals(0, store.getCplxIm(i0), storeDiffersAt(i0));
+				assertEquals(0, store.getCplxIm((long)i0), storeDiffersAt(i0));
+			}
+		}
+		assertIndexOutOfBounds(data, store::getNum, store::getNum);
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void getChar(final NumCaseData data) {
+		final RNumericStore store= createStore(data);
+		
+		for (int i= 0; i < data.length; i++) {
+			final int i0= i;
+			if (data.nas[i0]) {
+				// undefined
+			}
+			else {
+				final String expected= Double.toString(data.values[i0]).replace("Infinity", "Inf");
+				assertEquals(expected, store.getChar(i0), storeDiffersAt(i0));
+				assertEquals(expected, store.getChar((long)i0), storeDiffersAt(i0));
+			}
+		}
+		assertIndexOutOfBounds(data, store::getChar, store::getChar);
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void getRaw(final NumCaseData data) {
+		final RNumericStore store= createStore(data);
+		
+		assertUnsupported(data, store::getRaw, store::getRaw);
+	}
+	
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void get(final NumCaseData data) {
+		final RNumericStore store= createStore(data);
+		
+		for (int i= 0; i < data.length; i++) {
+			final int i0= i;
+			if (data.nas[i0]) {
+				assertNull(store.get(i0), storeDiffersAt(i0));
+			}
+			else {
+				final Double expected= Double.valueOf(data.values[i0]);
+				assertEquals(expected, store.get(i0), storeDiffersAt(i0));
+				assertEquals(expected, store.get((long)i0), storeDiffersAt(i0));
+			}
+		}
+		assertIndexOutOfBounds(data, store::get, store::get);
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void toArray(final NumCaseData data) {
+		final RNumericStore store= createStore(data);
+		
+		final @Nullable Double[] array= store.toArray();
+		
+		assertEquals(data.values.length, array.length);
+		
+		for (int i= 0; i < data.length; i++) {
+			final int i0= i;
+			if (data.nas[i0]) {
+				assertNull(array[i0], arrayDiffersAt(i0));
+			}
+			else {
+				final Double expected= Double.valueOf(data.values[i0]);
+				assertEquals(expected, array[i0], arrayDiffersAt(i0));
+			}
+		}
+	}
+	
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RRaw32StoreSerTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RRaw32StoreSerTest.java
new file mode 100644
index 0000000..67c0de6
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RRaw32StoreSerTest.java
@@ -0,0 +1,36 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ # 
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ # 
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ # 
+ # Contributors:
+ #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.rj.data.RRawStore;
+
+
+@NonNullByDefault
+public class RRaw32StoreSerTest extends RRaw32StoreTest {
+	
+	
+	public RRaw32StoreSerTest() {
+	}
+	
+	
+	@Override
+	protected RRawStore createStore(final RawCaseData data) {
+		return createSerStore((RRaw32Store)super.createStore(data),
+				RRaw32Store::new );
+	}
+	
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RRaw32StoreTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RRaw32StoreTest.java
new file mode 100644
index 0000000..012d3fd
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RRaw32StoreTest.java
@@ -0,0 +1,38 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ # 
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ # 
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ # 
+ # Contributors:
+ #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import java.util.Arrays;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.rj.data.RRawStore;
+
+
+@NonNullByDefault
+public class RRaw32StoreTest extends RRawStoreTest {
+	
+	
+	public RRaw32StoreTest() {
+	}
+	
+	
+	@Override
+	protected RRawStore createStore(final RawCaseData data) {
+		return new RRaw32Store(
+				Arrays.copyOf(data.values, data.length) );
+	}
+	
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RRawFix64StoreTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RRawFix64StoreTest.java
new file mode 100644
index 0000000..8c9090f
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RRawFix64StoreTest.java
@@ -0,0 +1,47 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ # 
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ # 
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ # 
+ # Contributors:
+ #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import static org.eclipse.statet.rj.data.impl.RRawFix64Store.SEGMENT_LENGTH;
+
+import java.util.Arrays;
+
+import org.eclipse.statet.jcommons.lang.NonNull;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.rj.data.RRawStore;
+
+
+@NonNullByDefault
+public class RRawFix64StoreTest extends RRawStoreTest {
+	
+	
+	public RRawFix64StoreTest() {
+	}
+	
+	
+	@Override
+	protected RRawStore createStore(final RawCaseData data) {
+		final int segments= getSegmentCount(data, SEGMENT_LENGTH);
+		final var values= new byte [segments] @NonNull[];
+		for (int i= 0, start= 0; i < values.length; i++) {
+			final int end= Math.min(start + SEGMENT_LENGTH, data.length);
+			values[i]= Arrays.copyOfRange(data.values, start, end);
+			start= end;
+		}
+		return new RRawFix64Store(values);
+	}
+	
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RRawStoreTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RRawStoreTest.java
new file mode 100644
index 0000000..b4ce383
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RRawStoreTest.java
@@ -0,0 +1,241 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ # 
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ # 
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ # 
+ # Contributors:
+ #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+
+import static org.eclipse.statet.rj.data.impl.AbstractRStore.DEFAULT_LONG_DATA_SEGMENT_LENGTH;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.rj.data.RObject;
+import org.eclipse.statet.rj.data.RRawStore;
+import org.eclipse.statet.rj.data.RStore;
+
+
+@NonNullByDefault
+public abstract class RRawStoreTest extends AbstractRStoreTest {
+	
+	
+	static class RawCaseData extends CaseData {
+		
+		final byte[] values;
+		
+		
+		public RawCaseData(final String label, final byte[] values) {
+			super(label, values.length);
+			assert (values.length == this.length);
+			this.values= values;
+		}
+		
+	}
+	
+	protected static final List<RawCaseData> DEFAULT_DATA_SOURCES;
+	static {
+		final var datas= new ArrayList<RawCaseData>();
+		
+		datas.add(new RawCaseData("empty", new byte[0]));
+		
+		datas.add(new RawCaseData("single", new byte[] { 33 }));
+		datas.add(new RawCaseData("single-Min", new byte[] { RRawStore.MIN_BYTE }));
+		datas.add(new RawCaseData("single-Max", new byte[] { RRawStore.MAX_BYTE }));
+		
+		{	final byte[] values= new byte[0x100];
+			for (int i= 0; i < values.length; i++) {
+				values[i]= (byte)(i & 0xFF);
+			}
+			datas.add(new RawCaseData("seq", values));
+		}
+		
+		{	final Random rand= new Random(16857);
+			final byte[] values= new byte[100000];
+			for (int i= 0; i < values.length; i++) {
+				values[i]= (byte)(rand.nextInt(0xFF + 1) & 0xFF);
+			}
+			datas.add(new RawCaseData("rand100000", values));
+		}
+		if (isBigDataEnabled(1)) {
+			final Random rand= new Random(46);
+			final byte[] values= new byte[DEFAULT_LONG_DATA_SEGMENT_LENGTH * 2 + 13];
+			for (int i= 0; i < values.length; i++) {
+				values[i]= (byte)(rand.nextInt(0xFF + 1) & 0xFF);
+			}
+			datas.add(new RawCaseData("randMultiSeg", values));
+		}
+		
+		DEFAULT_DATA_SOURCES= datas;
+	}
+	
+	
+	public RRawStoreTest() {
+	}
+	
+	
+	public static List<RawCaseData> provideCaseDatas() {
+		return new ArrayList<>(DEFAULT_DATA_SOURCES);
+	}
+	
+	protected abstract RRawStore createStore(final RawCaseData data);
+	
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void getStoreType(final RawCaseData data) {
+		final RRawStore store= createStore(data);
+		
+		assertEquals(RStore.RAW, store.getStoreType());
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void getBaseVectorRClassName(final RawCaseData data) {
+		final RRawStore store= createStore(data);
+		
+		assertEquals(RObject.CLASSNAME_RAW, store.getBaseVectorRClassName());
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void length(final RawCaseData data) {
+		final RRawStore store= createStore(data);
+		
+		checkLength(data, store);
+	}
+	
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void isNA(final RawCaseData data) {
+		final RRawStore store= createStore(data);
+		
+		checkIsNA(data, store);
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void isMissing(final RawCaseData data) {
+		final RRawStore store= createStore(data);
+		
+		for (int i= 0; i < data.length; i++) {
+			assertFalse(store.isMissing(i));
+		}
+		assertIndexOutOfBounds(data, store::isMissing, store::isMissing);
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void getLogi(final RawCaseData data) {
+//		final RRawStore store= createStore(data);
+//		
+//		for (int i= 0; i < data.length; i++) {
+//			final boolean expected= (data.values[i] != 0);
+//			assertEquals(expected, store.getLogi(i));
+//			assertEquals(expected, store.getLogi((long)i));
+//		}
+//		assertIndexOutOfBounds(data, store::getLogi, store::getLogi);
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void getInt(final RawCaseData data) {
+		final RRawStore store= createStore(data);
+		
+		for (int i= 0; i < data.length; i++) {
+			final int expected= Byte.toUnsignedInt(data.values[i]);
+			assertEquals(expected, store.getInt(i));
+			assertEquals(expected, store.getInt((long)i));
+		}
+		assertIndexOutOfBounds(data, store::getInt, store::getInt);
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void getNum(final RawCaseData data) {
+//		final RRawStore store= createStore(data);
+//		
+//		for (int i= 0; i < data.length; i++) {
+//			final double expected= Byte.toUnsignedInt(data.values[i]);
+//			assertEquals(expected, store.getNum(i));
+//			assertEquals(expected, store.getNum((long)i));
+//		}
+//		assertIndexOutOfBounds(data, store::getNum, store::getNum);
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void getChar(final RawCaseData data) {
+		final RRawStore store= createStore(data);
+		
+		for (int i= 0; i < data.length; i++) {
+			String expected= Integer.toHexString(Byte.toUnsignedInt(data.values[i]));
+			if (expected.length() == 1) {
+				expected= "0" + expected;
+			}
+			assertEquals(expected, store.getChar(i));
+			assertEquals(expected, store.getChar((long)i));
+		}
+		assertIndexOutOfBounds(data, store::getChar, store::getChar);
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void getRaw(final RawCaseData data) {
+		final RRawStore store= createStore(data);
+		
+		for (int i= 0; i < data.length; i++) {
+			final byte expected= data.values[i];
+			assertEquals(expected, store.getRaw(i));
+			assertEquals(expected, store.getRaw((long)i));
+		}
+		assertIndexOutOfBounds(data, store::getRaw, store::getRaw);
+	}
+	
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void get(final RawCaseData data) {
+		final RRawStore store= createStore(data);
+		
+		for (int i= 0; i < data.length; i++) {
+			final byte expected= data.values[i];
+			assertEquals(expected, store.get(i));
+			assertEquals(expected, store.get((long)i));
+		}
+		assertIndexOutOfBounds(data, store::get, store::get);
+	}
+	
+	@ParameterizedTest
+	@MethodSource("provideCaseDatas")
+	public void toArray(final RawCaseData data) {
+		final RRawStore store= createStore(data);
+		
+		final Byte[] array= store.toArray();
+		
+		assertEquals(data.values.length, array.length);
+		
+		for (int i= 0; i < data.length; i++) {
+			assertEquals(data.values[i], array[i], arrayDiffersAt(i));
+		}
+	}
+	
+}
diff --git a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/AbstractComplexStore.java b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/AbstractComplexStore.java
index 453e532..4546f6e 100644
--- a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/AbstractComplexStore.java
+++ b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/AbstractComplexStore.java
@@ -29,14 +29,33 @@
 	
 	protected static final String toChar(final double real, final double imaginary) {
 		final StringBuilder sb= new StringBuilder();
-		sb.append(AbstractNumericStore.toChar(real));
-		{	final String imStr= AbstractNumericStore.toChar(imaginary);
-			if (imStr.charAt(0) != '-') {
-				sb.append('+');
-			}
-			sb.append(imStr);
+		if (real == Double.POSITIVE_INFINITY) {
+			sb.append("Inf");
 		}
-		sb.append('i');
+		else if (real == Double.NEGATIVE_INFINITY) {
+			sb.append("-Inf");
+		}
+		else {
+			sb.append(real);
+		}
+		if (imaginary == Double.POSITIVE_INFINITY) {
+			sb.append("+Infi");
+		}
+		else if (imaginary == Double.NEGATIVE_INFINITY) {
+			sb.append("-Infi");
+		}
+		else if (Double.isNaN(imaginary)) {
+			sb.append("+NaNi");
+		}
+		else if (imaginary >= 0) {
+			sb.append('+');
+			sb.append(imaginary);
+			sb.append('i');
+		}
+		else {
+			sb.append(imaginary);
+			sb.append('i');
+		}
 		return sb.toString();
 	}
 	
diff --git a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/AbstractRStore.java b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/AbstractRStore.java
index e6c056e..f8c65dd 100644
--- a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/AbstractRStore.java
+++ b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/AbstractRStore.java
@@ -16,10 +16,14 @@
 
 import java.util.Arrays;
 
+import org.eclipse.statet.jcommons.lang.NonNull;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
 import org.eclipse.statet.rj.data.RDataUtils;
 import org.eclipse.statet.rj.data.RStore;
 
 
+@NonNullByDefault
 public abstract class AbstractRStore<P> implements RStore<P> {
 	
 	
@@ -42,13 +46,13 @@
 	protected static final int WITH_NAMES= 0x1;
 	
 	protected static final byte[] EMPTY_BYTE_ARRAY= new byte[0];
-	protected static final byte[][] EMPTY_BYTE_2dARRAY= new byte[0][];
+	protected static final byte [] @NonNull[] EMPTY_BYTE_2dARRAY= new byte[0][];
 	protected static final int[] EMPTY_INT_ARRAY= new int[0];
-	protected static final int[][] EMPTY_INT_2dARRAY= new int[0][];
+	protected static final int [] @NonNull[] EMPTY_INT_2dARRAY= new int[0][];
 	protected static final double[] EMPTY_DOUBLE_ARRAY= new double[0];
-	protected static final double[][] EMPTY_DOUBLE_2dARRAY= new double[0][];
+	protected static final double [] @NonNull[] EMPTY_DOUBLE_2dARRAY= new double[0][];
 	protected static final String[] EMPTY_STRING_ARRAY= new String[0];
-	protected static final String[][] EMPTY_STRING_2dARRAY= new String[0][];
+	protected static final String [] @NonNull[] EMPTY_STRING_2dARRAY= new String[0][];
 	
 	protected static final int DEFAULT_LONG_DATA_SEGMENT_LENGTH= 1 << 28;
 	
@@ -81,7 +85,25 @@
 	}
 	
 	
-	protected static final long check2dArrayLength(final int[][] array, final int segmentLength) {
+	protected static final long check2dArrayLength(final boolean [] @NonNull[] array, final int segmentLength) {
+		long length= 0;
+		if (array.length > 0) {
+			final int last= array.length - 1;
+			for (int i= 0; i < last; i++) {
+				if (array[i].length != segmentLength) {
+					throw new IllegalArgumentException("Unexpected data segment length (" + array[i].length + ", but " + segmentLength + " expected)");
+				}
+			}
+			length= last * (long)segmentLength;
+			if (array[last].length > segmentLength) {
+				throw new IllegalArgumentException("Unexpected data segment length (" + array[last].length + ", but max " + segmentLength + " expected)");
+			}
+			length+= array[last].length;
+		}
+		return length;
+	}
+	
+	protected static final long check2dArrayLength(final int [] @NonNull[] array, final int segmentLength) {
 		long length= 0;
 		if (array.length > 0) {
 			final int last= array.length - 1;
@@ -99,7 +121,7 @@
 		return length;
 	}
 	
-	protected static final long check2dArrayLength(final double[][] array, final int segmentLength) {
+	protected static final long check2dArrayLength(final double[] @NonNull[] array, final int segmentLength) {
 		long length= 0;
 		if (array.length > 0) {
 			final int last= array.length - 1;
@@ -117,7 +139,7 @@
 		return length;
 	}
 	
-	protected static final long check2dArrayLength(final byte[][] array, final int segmentLength) {
+	protected static final long check2dArrayLength(final byte [] @NonNull[] array, final int segmentLength) {
 		long length= 0;
 		if (array.length > 0) {
 			final int last= array.length - 1;
@@ -135,7 +157,7 @@
 		return length;
 	}
 	
-	protected static final long check2dArrayLength(final Object[][] array, final int segmentLength) {
+	protected static final long check2dArrayLength(final Object [] @NonNull[] array, final int segmentLength) {
 		long length= 0;
 		if (array.length > 0) {
 			final int last= array.length - 1;
@@ -153,11 +175,11 @@
 		return length;
 	}
 	
-	protected static final int[][] new2dIntArray(final long length, final int segmentLength) {
+	protected static final int [] @NonNull[] new2dIntArray(final long length, final int segmentLength) {
 		if (length == 0) {
 			return EMPTY_INT_2dARRAY;
 		}
-		final int[][] array= new int[1 + (int) ((length - 1) / segmentLength)][];
+		final var array= new int[1 + (int) ((length - 1) / segmentLength)] @NonNull[];
 		final int last= array.length - 1;
 		for (int i= 0; i < last; i++) {
 			array[i]= new int[segmentLength];
@@ -168,11 +190,11 @@
 		return array;
 	}
 	
-	protected static final double[][] new2dDoubleArray(final long length, final int segmentLength) {
+	protected static final double [] @NonNull[] new2dDoubleArray(final long length, final int segmentLength) {
 		if (length == 0) {
 			return EMPTY_DOUBLE_2dARRAY;
 		}
-		final double[][] array= new double[1 + (int) ((length - 1) / segmentLength)][];
+		final var array= new double [1 + (int) ((length - 1) / segmentLength)] @NonNull[];
 		final int last= array.length - 1;
 		for (int i= 0; i < last; i++) {
 			array[i]= new double[segmentLength];
@@ -183,11 +205,11 @@
 		return array;
 	}
 	
-	protected static final String[][] new2dStringArray(final long length, final int segmentLength) {
+	protected static final String [] @NonNull[] new2dStringArray(final long length, final int segmentLength) {
 		if (length == 0) {
 			return EMPTY_STRING_2dARRAY;
 		}
-		final String[][] array= new String[1 + (int) ((length - 1) / segmentLength)][];
+		final var array= new String [1 + (int) ((length - 1) / segmentLength)] @NonNull[];
 		final int last= array.length - 1;
 		for (int i= 0; i < last; i++) {
 			array[i]= new String[segmentLength];
@@ -198,11 +220,11 @@
 		return array;
 	}
 	
-	protected static final byte[][] new2dByteArray(final long length, final int segmentLength) {
+	protected static final byte [] @NonNull[] new2dByteArray(final long length, final int segmentLength) {
 		if (length == 0) {
 			return EMPTY_BYTE_2dARRAY;
 		}
-		final byte[][] array= new byte[1 + (int) ((length - 1) / segmentLength)][];
+		final var array= new byte [1 + (int) ((length - 1) / segmentLength)] @NonNull[];
 		final int last= array.length - 1;
 		for (int i= 0; i < last; i++) {
 			array[i]= new byte[segmentLength];
diff --git a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/DefaultRObjectFactory.java b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/DefaultRObjectFactory.java
index 71f7411..85a0596 100644
--- a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/DefaultRObjectFactory.java
+++ b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/DefaultRObjectFactory.java
@@ -463,7 +463,7 @@
 	
 	@Override
 	public RComplexStore createCplxData(final double [] reValues, final double [] imValues) {
-		return new RComplexB32Store(reValues, imValues, null);
+		return new RComplexB32Store(reValues, imValues, (int[])null);
 	}
 	
 	public RComplexStore createCplxData(final long length) {
diff --git a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RCharacter32Store.java b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RCharacter32Store.java
index e1fdcc4..f899dba 100644
--- a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RCharacter32Store.java
+++ b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RCharacter32Store.java
@@ -20,19 +20,23 @@
 import java.io.ObjectOutput;
 import java.util.Arrays;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.rj.data.RJIO;
 
 
 /**
  * This implementation is limited to length of 2<sup>31</sup>-1.
  */
+@NonNullByDefault
 public class RCharacter32Store extends AbstractCharacterStore
 		implements RDataResizeExtension<String>, ExternalizableRStore, Externalizable {
 	
 	
 	private int length;
 	
-	protected String[] charValues;
+	protected @Nullable String [] charValues;
 	
 	
 	public RCharacter32Store() {
@@ -42,23 +46,23 @@
 	
 	public RCharacter32Store(final int length) {
 		this.length= length;
-		this.charValues= new String[length];
+		this.charValues= new @Nullable String [length];
 		Arrays.fill(this.charValues, "");
 	}
 	
-	public RCharacter32Store(final String[] values) {
+	public RCharacter32Store(final @Nullable String [] values) {
 		this.length= values.length;
 		this.charValues= values;
 	}
 	
-	public RCharacter32Store(final String[] values, final int length) {
+	public RCharacter32Store(final @Nullable String [] values, final int length) {
 		this.length= length;
 		this.charValues= values;
 	}
 	
 	
 	RCharacter32Store(final RCharacter32Store source, final boolean reuse) {
-		String[] values;
+		@Nullable String [] values;
 		if (reuse) {
 			values= source.charValues;
 		}
@@ -73,7 +77,7 @@
 	
 	public RCharacter32Store(final RJIO io, final int length) throws IOException {
 		this.length= length;
-		this.charValues= new String[length];
+		this.charValues= new @Nullable String [length];
 		io.readStringData(this.charValues, length);
 	}
 	
@@ -85,7 +89,7 @@
 	@Override
 	public void readExternal(final ObjectInput in) throws IOException {
 		this.length= in.readInt();
-		this.charValues= new String[this.length];
+		this.charValues= new @Nullable String [this.length];
 		for (int i= 0; i < this.length; i++) {
 			final int l= in.readInt();
 			if (l >= 0) {
@@ -131,6 +135,7 @@
 		return this.length;
 	}
 	
+	
 	@Override
 	public boolean isNA(final int idx) {
 		return (this.charValues[idx] == null);
@@ -138,7 +143,7 @@
 	
 	@Override
 	public boolean isNA(final long idx) {
-		if (idx < 0 || idx >= length()) {
+		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
 		return (this.charValues[(int) idx] == null);
@@ -154,7 +159,7 @@
 	
 	@Override
 	public void setNA(final long idx) {
-		if (idx < 0 || idx >= length()) {
+		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
 //		if (this.charValues[(int) idx] == null) {
@@ -170,20 +175,23 @@
 	
 	@Override
 	public boolean isMissing(final long idx) {
-		if (idx < 0 || idx >= length()) {
+		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
 		return (this.charValues[(int) idx] == null);
 	}
 	
+	
 	@Override
+	@SuppressWarnings("null")
 	public String getChar(final int idx) {
 		return this.charValues[idx];
 	}
 	
 	@Override
+	@SuppressWarnings("null")
 	public String getChar(final long idx) {
-		if (idx < 0 || idx >= length()) {
+		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
 		return this.charValues[(int) idx];
@@ -197,7 +205,7 @@
 	
 	@Override
 	public void setChar(final long idx, final String value) {
-		if (idx < 0 || idx >= length()) {
+		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
 //		assert (value != null);
@@ -247,24 +255,24 @@
 	
 	
 	@Override
-	public String get(final int idx) {
-		if (idx < 0 || idx >= length()) {
+	public @Nullable String get(final int idx) {
+		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
 		return this.charValues[idx];
 	}
 	
 	@Override
-	public String get(final long idx) {
-		if (idx < 0 || idx >= length()) {
+	public @Nullable String get(final long idx) {
+		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
 		return this.charValues[(int) idx];
 	}
 	
 	@Override
-	public String[] toArray() {
-		final String[] array= new String[length()];
+	public @Nullable String [] toArray() {
+		final var array= new @Nullable String [this.length];
 		System.arraycopy(this.charValues, 0, array, 0, array.length);
 		return array;
 	}
@@ -278,7 +286,7 @@
 		if (fromIdx < 0) {
 			fromIdx= 0;
 		}
-		final int l= length();
+		final int l= this.length;
 		final String[] chars= this.charValues;
 		for (int i= (int) fromIdx; i < l; i++) {
 			if (chars[i] == null) {
@@ -292,7 +300,7 @@
 		if (fromIdx < 0) {
 			fromIdx= 0;
 		}
-		final int l= length();
+		final int l= this.length;
 		final String[] chars= this.charValues;
 		for (int i= fromIdx; i < l; i++) {
 			if (chars[i] == null) {
@@ -311,7 +319,7 @@
 		if (fromIdx < 0) {
 			fromIdx= 0;
 		}
-		final int l= length();
+		final int l= this.length;
 		final String[] chars= this.charValues;
 		for (int i= (int) fromIdx; i < l; i++) {
 			if (chars[i] != null && chars[i].equals(character)) {
@@ -328,7 +336,7 @@
 		if (fromIdx < 0) {
 			fromIdx= 0;
 		}
-		final int l= length();
+		final int l= this.length;
 		final String[] chars= this.charValues;
 		while (fromIdx < l) {
 			if (chars[fromIdx] != null && chars[fromIdx].equals(character)) {
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 42074c8..3c8e9e8 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
@@ -17,9 +17,14 @@
 import java.io.IOException;
 import java.util.Arrays;
 
+import org.eclipse.statet.jcommons.lang.NonNull;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.rj.data.RJIO;
 
 
+@NonNullByDefault
 public class RCharacterFix64Store extends AbstractCharacterStore
 		implements ExternalizableRStore {
 	
@@ -29,7 +34,7 @@
 	
 	private final long length;
 	
-	protected final String[][] charValues;
+	protected final @Nullable String [] @NonNull[] charValues;
 	
 	
 	public RCharacterFix64Store(final long length) {
@@ -40,7 +45,7 @@
 		}
 	}
 	
-	public RCharacterFix64Store(final String[][] values) {
+	public RCharacterFix64Store(final @Nullable String [] @NonNull[] values) {
 		this.length= check2dArrayLength(values, SEGMENT_LENGTH);
 		this.charValues= values;
 	}
@@ -127,7 +132,7 @@
 	
 	
 	@Override
-	public String get(final int idx) {
+	public @Nullable String get(final int idx) {
 		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
@@ -135,7 +140,7 @@
 	}
 	
 	@Override
-	public String get(final long idx) {
+	public @Nullable String get(final long idx) {
 		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
@@ -143,9 +148,9 @@
 	}
 	
 	@Override
-	public String[] toArray() {
+	public @Nullable String [] toArray() {
 		final int l= checkToArrayLength();
-		final String[] array= new String[l];
+		final var array= new @Nullable String[l];
 		int k= 0;
 		for (int i= 0; i < this.charValues.length; i++) {
 			final String[] chars= this.charValues[i];
diff --git a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RComplexB32Store.java b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RComplexB32Store.java
index 51b073a..e837016 100644
--- a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RComplexB32Store.java
+++ b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RComplexB32Store.java
@@ -19,6 +19,9 @@
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
 
+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;
@@ -27,14 +30,15 @@
 /**
  * This implementation is limited to length of 2<sup>31</sup>-1.
  */
+@NonNullByDefault
 public class RComplexB32Store extends AbstractComplexStore
 		implements RDataResizeExtension<RComplexStore.Complex>, ExternalizableRStore, Externalizable {
 	
 	
 	private int length;
 	
-	protected double[] realValues;
-	protected double[] imaginaryValues;
+	protected double [] realValues;
+	protected double [] imaginaryValues;
 	
 	
 	public RComplexB32Store() {
@@ -49,13 +53,14 @@
 		this.imaginaryValues= new double[length];
 	}
 	
-	protected RComplexB32Store(final double[] realValues, final double[] imaginaryValues) {
+	protected RComplexB32Store(final double [] realValues, final double [] imaginaryValues) {
 		this.length= realValues.length;
 		this.realValues= realValues;
 		this.imaginaryValues= imaginaryValues;
 	}
 	
-	public RComplexB32Store(final double[] realValues, final double[] imaginaryValues, final int[] naIdxs) {
+	public RComplexB32Store(final double [] realValues, final double [] imaginaryValues,
+			final int @Nullable[] naIdxs) {
 		if (realValues.length != imaginaryValues.length) {
 			throw new IllegalArgumentException();
 		}
@@ -70,6 +75,27 @@
 		}
 	}
 	
+	public RComplexB32Store(final double [] realValues, final double [] imaginaryValues,
+			final boolean @Nullable[] isNAs) {
+		if (imaginaryValues.length != realValues.length) {
+			throw new IllegalArgumentException();
+		}
+		this.length= realValues.length;
+		this.realValues= realValues;
+		this.imaginaryValues= imaginaryValues;
+		if (isNAs != null) {
+			if (isNAs.length != realValues.length) {
+				throw new IllegalArgumentException();
+			}
+			for (int i= 0; i < isNAs.length; i++) {
+				if (isNAs[i]) {
+					this.realValues[i]= NA_numeric_DOUBLE;
+					this.imaginaryValues[i]= NA_numeric_DOUBLE;
+				}
+			}
+		}
+	}
+	
 	
 	public RComplexB32Store(final RJIO io, final int length) throws IOException {
 		this.length= length;
@@ -119,6 +145,7 @@
 		return this.length;
 	}
 	
+	
 	@Override
 	public boolean isNA(final int idx) {
 		final double v= this.realValues[idx];
@@ -128,7 +155,7 @@
 	
 	@Override
 	public boolean isNA(final long idx) {
-		if (idx < 0 || idx >= length()) {
+		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
 		final double v= this.realValues[(int) idx];
@@ -144,7 +171,7 @@
 	
 	@Override
 	public void setNA(final long idx) {
-		if (idx < 0 || idx >= length()) {
+		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
 		this.realValues[(int) idx]= NA_numeric_DOUBLE;
@@ -160,7 +187,7 @@
 	
 	@Override
 	public boolean isNaN(final long idx) {
-		if (idx < 0 || idx >= length()) {
+		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
 		final double value= this.realValues[(int) idx];
@@ -175,12 +202,13 @@
 	
 	@Override
 	public boolean isMissing(final long idx) {
-		if (idx < 0 || idx >= length()) {
+		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
 		return (Double.isNaN(this.realValues[(int) idx]));
 	}
 	
+	
 	@Override
 	public double getCplxRe(final int idx) {
 		return this.realValues[idx];
@@ -188,7 +216,7 @@
 	
 	@Override
 	public double getCplxRe(final long idx) {
-		if (idx < 0 || idx >= length()) {
+		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
 		return this.realValues[(int) idx];
@@ -201,7 +229,7 @@
 	
 	@Override
 	public double getCplxIm(final long idx) {
-		if (idx < 0 || idx >= length()) {
+		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
 		return this.imaginaryValues[(int) idx];
@@ -221,7 +249,7 @@
 	
 	@Override
 	public void setCplx(final long idx, final double real, final double imaginary) {
-		if (idx < 0 || idx >= length()) {
+		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
 		if (Double.isNaN(real) || Double.isNaN(imaginary)) {
@@ -248,7 +276,7 @@
 	
 	@Override
 	public void setNum(final long idx, final double real) {
-		if (idx < 0 || idx >= length()) {
+		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
 		if (Double.isNaN(real)) {
@@ -315,8 +343,8 @@
 	
 	
 	@Override
-	public Complex get(final int idx) {
-		if (idx < 0 || idx >= length()) {
+	public @Nullable Complex get(final int idx) {
+		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
 		final double v= this.realValues[idx];
@@ -327,8 +355,8 @@
 	}
 	
 	@Override
-	public Complex get(final long idx) {
-		if (idx < 0 || idx >= length()) {
+	public @Nullable Complex get(final long idx) {
+		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
 		final double v= this.realValues[(int) idx];
@@ -339,10 +367,10 @@
 	}
 	
 	@Override
-	public Complex[] toArray() {
+	public @Nullable Complex [] toArray() {
+		final var array= new @Nullable Complex[this.length];
 		final double[] reals= this.realValues;
 		final double[] imgs= this.imaginaryValues;
-		final Complex[] array= new Complex[length()];
 		for (int i= 0; i < array.length; i++) {
 			final double v= reals[i];
 			if (!Double.isNaN(v)
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 b0de200..9d26707 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
@@ -16,10 +16,15 @@
 
 import java.io.IOException;
 
+import org.eclipse.statet.jcommons.lang.NonNull;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.rj.data.RJIO;
 import org.eclipse.statet.rj.data.RStore;
 
 
+@NonNullByDefault
 public class RComplexBFix64Store extends AbstractComplexStore
 		implements ExternalizableRStore {
 	
@@ -29,8 +34,8 @@
 	
 	private final long length;
 	
-	protected final double[][] realValues;
-	protected final double[][] imaginaryValues;
+	protected final double [] @NonNull[] realValues;
+	protected final double [] @NonNull[] imaginaryValues;
 	
 	
 	public RComplexBFix64Store(final long length) {
@@ -39,7 +44,7 @@
 		this.imaginaryValues= new2dDoubleArray(length, SEGMENT_LENGTH);
 	}
 	
-	public RComplexBFix64Store(final double[][] realValues, final double[][] imaginaryValues) {
+	public RComplexBFix64Store(final double [] @NonNull[] realValues, final double [] @NonNull[] imaginaryValues) {
 		this.length= check2dArrayLength(realValues, SEGMENT_LENGTH);
 		if (this.length != check2dArrayLength(imaginaryValues, SEGMENT_LENGTH)) {
 			throw new IllegalArgumentException();
@@ -48,6 +53,31 @@
 		this.imaginaryValues= imaginaryValues;
 	}
 	
+	public RComplexBFix64Store(final double [] @NonNull[] realValues, final double [] @NonNull[] imaginaryValues,
+			final boolean @Nullable[] @NonNull[] isNAs) {
+		this.length= check2dArrayLength(realValues, SEGMENT_LENGTH);
+		if (this.length != check2dArrayLength(imaginaryValues, SEGMENT_LENGTH)) {
+			throw new IllegalArgumentException();
+		}
+		this.realValues= realValues;
+		this.imaginaryValues= imaginaryValues;
+		if (isNAs != null) {
+			if (check2dArrayLength(isNAs, SEGMENT_LENGTH) != this.length) {
+				throw new IllegalArgumentException();
+			}
+			for (int i= 0; i < isNAs.length; i++) {
+				final boolean[] isNAi= isNAs[i];
+				for (int j= 0; j < isNAi.length; j++) {
+					if (isNAi[j]) {
+						this.realValues[i][j]= NA_numeric_DOUBLE;
+						this.imaginaryValues[i][j]= NA_numeric_DOUBLE;
+					}
+				}
+			}
+
+		}
+	}
+	
 	
 	public RComplexBFix64Store(final RJIO io, final long length) throws IOException {
 		this.length= length;
@@ -221,7 +251,7 @@
 	
 	
 	@Override
-	public Complex get(final int idx) {
+	public @Nullable Complex get(final int idx) {
 		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
@@ -233,7 +263,7 @@
 	}
 	
 	@Override
-	public Complex get(final long idx) {
+	public @Nullable Complex get(final long idx) {
 		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
@@ -245,9 +275,9 @@
 	}
 	
 	@Override
-	public Complex[] toArray() {
+	public @Nullable Complex [] toArray() {
 		final int l= checkToArrayLength();
-		final Complex[] array= new Complex[l];
+		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];
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 195c891..0e0b5ac 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
@@ -17,11 +17,16 @@
 import java.io.IOException;
 import java.util.Arrays;
 
+import org.eclipse.statet.jcommons.lang.NonNull;
+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;
 import org.eclipse.statet.rj.data.RStore;
 
 
+@NonNullByDefault
 public class RFactorFix64Store extends AbstractFactorStore
 		implements ExternalizableRStore {
 	
@@ -31,7 +36,7 @@
 	
 	private final long length;
 	
-	protected final int[][] codes;
+	protected final int [] @NonNull[] codes;
 	
 	protected final RCharacter32Store codeLabels;
 	
@@ -44,7 +49,7 @@
 		this.codeLabels= new RUniqueCharacter32Store(levelLabels);
 	}
 	
-	public RFactorFix64Store(final int[][] codes, final boolean isOrdered, final String[] levelLabels) {
+	public RFactorFix64Store(final int [] @NonNull[] codes, final boolean isOrdered, final String[] levelLabels) {
 		this.length= check2dArrayLength(codes, SEGMENT_LENGTH);
 		this.isOrdered= isOrdered;
 		this.codes= codes;
@@ -188,7 +193,7 @@
 	
 	@Override
 	public RCharacterStore toCharacterData() {
-		final String[][] data= new2dStringArray(this.length, SEGMENT_LENGTH);
+		final @Nullable String [] @NonNull[] data= new2dStringArray(this.length, SEGMENT_LENGTH);
 		for (int i= 0; i < data.length; i++) {
 			final String[] chars= data[i];
 			final int[] ints= this.codes[i];
@@ -204,7 +209,7 @@
 	
 	
 	@Override
-	public Integer get(final int idx) {
+	public @Nullable Integer get(final int idx) {
 		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
@@ -215,7 +220,7 @@
 	}
 	
 	@Override
-	public Integer get(final long idx) {
+	public @Nullable Integer get(final long idx) {
 		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
@@ -226,9 +231,9 @@
 	}
 	
 	@Override
-	public Integer[] toArray() {
+	public @Nullable Integer[] toArray() {
 		final int l= checkToArrayLength();
-		final Integer[] array= new Integer[l];
+		final var array= new @Nullable Integer [l];
 		int k= 0;
 		for (int i= 0; i < this.codes.length; i++, k++) {
 			final int[] ints= this.codes[i];
diff --git a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RInteger32Store.java b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RInteger32Store.java
index c36ada1..8fbeb32 100644
--- a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RInteger32Store.java
+++ b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RInteger32Store.java
@@ -19,19 +19,23 @@
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.rj.data.RJIO;
 
 
 /**
  * This implementation is limited to length of 2<sup>31</sup>-1.
  */
+@NonNullByDefault
 public class RInteger32Store extends AbstractIntegerStore
 		implements RDataResizeExtension<Integer>, ExternalizableRStore, Externalizable {
 	
 	
 	private int length;
 	
-	protected int[] intValues;
+	protected int [] intValues;
 	
 	
 	public RInteger32Store() {
@@ -44,17 +48,17 @@
 		this.length= length;
 	}
 	
-	public RInteger32Store(final int[] values) {
+	public RInteger32Store(final int [] values) {
 		this.length= values.length;
 		this.intValues= values;
 	}
 	
-	public RInteger32Store(final int[] values, final int length) {
+	public RInteger32Store(final int [] values, final int length) {
 		this.length= length;
 		this.intValues= values;
 	}
 	
-	public RInteger32Store(final int[] values, final int[] naIdxs) {
+	public RInteger32Store(final int [] values, final int @Nullable[] naIdxs) {
 		this.length= values.length;
 		this.intValues= values;
 		if (naIdxs != null) {
@@ -64,6 +68,21 @@
 		}
 	}
 	
+	public RInteger32Store(final int [] values, final boolean @Nullable[] isNAs) {
+		this.length= values.length;
+		this.intValues= values;
+		if (isNAs != null) {
+			if (isNAs.length != this.length) {
+				throw new IllegalArgumentException();
+			}
+			for (int i= 0; i < isNAs.length; i++) {
+				if (isNAs[i]) {
+					this.intValues[i]= NA_integer_INT;
+				}
+			}
+		}
+	}
+	
 	
 	public RInteger32Store(final RJIO io, final int length) throws IOException {
 		this.length= length;
@@ -115,7 +134,7 @@
 	
 	@Override
 	public boolean isNA(final long idx) {
-		if (idx < 0 || idx >= length()) {
+		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
 		return (this.intValues[(int) idx] == NA_integer_INT);
@@ -128,7 +147,7 @@
 	
 	@Override
 	public void setNA(final long idx) {
-		if (idx < 0 || idx >= length()) {
+		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
 		this.intValues[(int) idx]= NA_integer_INT;
@@ -141,7 +160,7 @@
 	
 	@Override
 	public boolean isMissing(final long idx) {
-		if (idx < 0 || idx >= length()) {
+		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
 		return (this.intValues[(int) idx] == NA_integer_INT);
@@ -154,7 +173,7 @@
 	
 	@Override
 	public int getInt(final long idx) {
-		if (idx < 0 || idx >= length()) {
+		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
 		return this.intValues[(int) idx];
@@ -169,7 +188,7 @@
 	@Override
 	public void setInt(final long idx, final int value) {
 //		assert (value != NA_integer_INT);
-		if (idx < 0 || idx >= length()) {
+		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
 		this.intValues[(int) idx]= value;
@@ -218,8 +237,8 @@
 	
 	
 	@Override
-	public Integer get(final int idx) {
-		if (idx < 0 || idx >= length()) {
+	public @Nullable Integer get(final int idx) {
+		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
 		final int v= this.intValues[idx];
@@ -228,8 +247,8 @@
 	}
 	
 	@Override
-	public Integer get(final long idx) {
-		if (idx < 0 || idx >= length()) {
+	public @Nullable Integer get(final long idx) {
+		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
 		final int v= this.intValues[(int) idx];
@@ -238,8 +257,8 @@
 	}
 	
 	@Override
-	public Integer[] toArray() {
-		final Integer[] array= new Integer[length()];
+	public @Nullable Integer [] toArray() {
+		final var array= new @Nullable Integer [this.length];
 		final int[] ints= this.intValues;
 		for (int i= 0; i < array.length; i++) {
 			final int v= ints[i];
@@ -259,7 +278,7 @@
 		if (fromIdx < 0) {
 			fromIdx= 0;
 		}
-		final int l= length();
+		final int l= this.length;
 		final int[] ints= this.intValues;
 		for (int i= (int) fromIdx; i < l; i++) {
 			if (ints[i] == NA_integer_INT) {
@@ -278,7 +297,7 @@
 		if (fromIdx < 0) {
 			fromIdx= 0;
 		}
-		final int l= length();
+		final int l= this.length;
 		final int[] ints= this.intValues;
 		for (int i= (int) fromIdx; i < l; i++) {
 			if (ints[i] == integer) {
@@ -291,14 +310,14 @@
 	
 	public void appendTo(final StringBuilder sb) {
 		sb.append('[');
-		final int l= length();
+		final int l= this.length;
 		if (l > 0) {
 			final int[] ints= this.intValues;
 			for (int i= 0; i < l; i++) {
 				sb.append(ints[i]);
 				sb.append(", ");
 			}
-			sb.delete(sb.length()-2, sb.length());
+			sb.delete(sb.length() - 2, sb.length());
 		}
 		sb.append(']');
 	}
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 3ed3a7e..dec2b02 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
@@ -16,9 +16,14 @@
 
 import java.io.IOException;
 
+import org.eclipse.statet.jcommons.lang.NonNull;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.rj.data.RJIO;
 
 
+@NonNullByDefault
 public class RIntegerFix64Store extends AbstractIntegerStore
 		implements ExternalizableRStore {
 	
@@ -28,7 +33,7 @@
 	
 	private final long length;
 	
-	protected final int[][] intValues;
+	protected final int [] @NonNull[] intValues;
 	
 	
 	public RIntegerFix64Store(final long length) {
@@ -36,11 +41,30 @@
 		this.intValues= new2dIntArray(length, SEGMENT_LENGTH);
 	}
 	
-	public RIntegerFix64Store(final int[][] values) {
+	public RIntegerFix64Store(final int [] @NonNull[] values) {
 		this.length= check2dArrayLength(values, SEGMENT_LENGTH);
 		this.intValues= values;
 	}
 	
+	public RIntegerFix64Store(final int [] @NonNull[] values,
+			final boolean @Nullable[] @NonNull[] isNAs) {
+		this.length= check2dArrayLength(values, SEGMENT_LENGTH);
+		this.intValues= values;
+		if (isNAs != null) {
+			if (check2dArrayLength(isNAs, SEGMENT_LENGTH) != this.length) {
+				throw new IllegalArgumentException();
+			}
+			for (int i= 0; i < isNAs.length; i++) {
+				final boolean[] isNAi= isNAs[i];
+				for (int j= 0; j < isNAi.length; j++) {
+					if (isNAi[j]) {
+						this.intValues[i][j]= NA_integer_INT;
+					}
+				}
+			}
+		}
+	}
+	
 	
 	public RIntegerFix64Store(final RJIO io, final long length) throws IOException {
 		this.length= length;
@@ -69,6 +93,7 @@
 		return this.length;
 	}
 	
+	
 	@Override
 	public boolean isNA(final int idx) {
 		return (this.intValues[idx / SEGMENT_LENGTH][idx % SEGMENT_LENGTH] == NA_integer_INT);
@@ -101,6 +126,7 @@
 		return (this.intValues[(int) (idx / SEGMENT_LENGTH)][(int) (idx % SEGMENT_LENGTH)] == NA_integer_INT);
 	}
 	
+	
 	@Override
 	public int getInt(final int idx) {
 		return this.intValues[idx / SEGMENT_LENGTH][idx % SEGMENT_LENGTH];
@@ -127,7 +153,7 @@
 	
 	
 	@Override
-	public Integer get(final int idx) {
+	public @Nullable Integer get(final int idx) {
 		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
@@ -138,7 +164,7 @@
 	}
 	
 	@Override
-	public Integer get(final long idx) {
+	public @Nullable Integer get(final long idx) {
 		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
@@ -149,9 +175,9 @@
 	}
 	
 	@Override
-	public Integer[] toArray() {
+	public @Nullable Integer [] toArray() {
 		final int l= checkToArrayLength();
-		final Integer[] array= new Integer[l];
+		final var array= new @Nullable Integer [l];
 		int k= 0;
 		for (int i= 0; i < this.intValues.length; i++, k++) {
 			final int[] ints= this.intValues[i];
diff --git a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RLogicalByte32Store.java b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RLogicalByte32Store.java
index 665e0f3..3ee1564 100644
--- a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RLogicalByte32Store.java
+++ b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RLogicalByte32Store.java
@@ -19,6 +19,9 @@
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.rj.data.RJIO;
 
 
@@ -27,6 +30,7 @@
  * 
  * This implementation is limited to length of 2<sup>31</sup>-1.
  */
+@NonNullByDefault
 public class RLogicalByte32Store extends AbstractLogicalStore
 		implements RDataResizeExtension<Boolean>, ExternalizableRStore, Externalizable {
 	
@@ -37,7 +41,7 @@
 	
 	private int length;
 	
-	private byte[] boolValues;
+	private byte [] boolValues;
 	
 	
 	public RLogicalByte32Store() {
@@ -50,18 +54,18 @@
 		this.boolValues= new byte[length];
 	}
 	
-	public RLogicalByte32Store(final boolean[] values) {
+	public RLogicalByte32Store(final boolean [] values) {
 		this.length= values.length;
 		this.boolValues= new byte[values.length];
-		for (int i= values.length-1; i >= 0; i--) {
+		for (int i= values.length - 1; i >= 0; i--) {
 			this.boolValues[i]= (values[i]) ? TRUE_BYTE : FALSE_BYTE;
 		}
 	}
 	
-	public RLogicalByte32Store(final boolean[] values, final int[] naIdxs) {
+	public RLogicalByte32Store(final boolean [] values, final int @Nullable[] naIdxs) {
 		this.length= values.length;
 		this.boolValues= new byte[values.length];
-		for (int i= values.length-1; i >= 0; i--) {
+		for (int i= values.length - 1; i >= 0; i--) {
 			this.boolValues[i]= (values[i]) ? TRUE_BYTE : FALSE_BYTE;
 		}
 		if (naIdxs != null) {
@@ -71,7 +75,25 @@
 		}
 	}
 	
-	public RLogicalByte32Store(final byte[] values) {
+	public RLogicalByte32Store(final boolean [] values, final boolean @Nullable[] isNAs) {
+		this.length= values.length;
+		this.boolValues= new byte[values.length];
+		for (int i= values.length - 1; i >= 0; i--) {
+			this.boolValues[i]= (values[i]) ? TRUE_BYTE : FALSE_BYTE;
+		}
+		if (isNAs != null) {
+			if (isNAs.length != this.length) {
+				throw new IllegalArgumentException();
+			}
+			for (int i= 0; i < isNAs.length; i++) {
+				if (isNAs[i]) {
+					this.boolValues[i]= NA_logical_BYTE;
+				}
+			}
+		}
+	}
+	
+	public RLogicalByte32Store(final byte [] values) {
 		this.length= values.length;
 		this.boolValues= values;
 	}
@@ -142,7 +164,7 @@
 	
 	@Override
 	public boolean isNA(final long idx) {
-		if (idx < 0 || idx >= length()) {
+		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
 		return (this.boolValues[(int) idx] == NA_logical_BYTE);
@@ -155,7 +177,7 @@
 	
 	@Override
 	public boolean isMissing(final long idx) {
-		if (idx < 0 || idx >= length()) {
+		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
 		return (this.boolValues[(int) idx] == NA_logical_BYTE);
@@ -168,7 +190,7 @@
 	
 	@Override
 	public void setNA(final long idx) {
-		if (idx < 0 || idx >= length()) {
+		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
 		this.boolValues[(int) idx]= NA_logical_BYTE;
@@ -181,7 +203,7 @@
 	
 	@Override
 	public boolean getLogi(final long idx) {
-		if (idx < 0 || idx >= length()) {
+		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
 		return (this.boolValues[(int) idx] == TRUE_BYTE);
@@ -194,7 +216,7 @@
 	
 	@Override
 	public void setLogi(final long idx, final boolean value) {
-		if (idx < 0 || idx >= length()) {
+		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
 		this.boolValues[(int) idx]= (value) ? TRUE_BYTE : FALSE_BYTE;
@@ -208,7 +230,7 @@
 	
 	public void insertLogi(final int idx, final boolean value) {
 		prepareInsert(new int[] { idx });
-		this.boolValues[idx]= value ? TRUE_BYTE : FALSE_BYTE;
+		this.boolValues[idx]= (value) ? TRUE_BYTE : FALSE_BYTE;
 	}
 	
 	@Override
@@ -242,8 +264,8 @@
 	
 	
 	@Override
-	public Boolean get(final int idx) {
-		if (idx < 0 || idx >= length()) {
+	public @Nullable Boolean get(final int idx) {
+		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
 		switch(this.boolValues[idx]) {
@@ -257,8 +279,8 @@
 	}
 	
 	@Override
-	public Boolean get(final long idx) {
-		if (idx < 0 || idx >= length()) {
+	public @Nullable Boolean get(final long idx) {
+		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
 		switch(this.boolValues[(int) idx]) {
@@ -272,8 +294,8 @@
 	}
 	
 	@Override
-	public Boolean[] toArray() {
-		final Boolean[] array= new Boolean[length()];
+	public @Nullable Boolean [] toArray() {
+		final var array= new @Nullable Boolean [this.length];
 		final byte[] bools= this.boolValues;
 		for (int i= 0; i < array.length; i++) {
 			switch(bools[i]) {
@@ -318,7 +340,7 @@
 		if (fromIdx < 0) {
 			fromIdx= 0;
 		}
-		final int l= length();
+		final int l= this.length;
 		final byte[] bools= this.boolValues;
 		if (integer != 0) {
 			for (int i= (int) fromIdx; i < l; i++) {
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 1287642..8eb95c5 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
@@ -16,6 +16,10 @@
 
 import java.io.IOException;
 
+import org.eclipse.statet.jcommons.lang.NonNull;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.rj.data.RJIO;
 
 
@@ -24,6 +28,7 @@
  * 
  * This implementation is limited to length of 2<sup>31</sup>-1.
  */
+@NonNullByDefault
 public class RLogicalByteFix64Store extends AbstractLogicalStore
 		implements ExternalizableRStore {
 	
@@ -36,7 +41,7 @@
 	
 	private final long length;
 	
-	private final byte[][] boolValues;
+	private final byte [] @NonNull[] boolValues;
 	
 	
 	public RLogicalByteFix64Store(final long length) {
@@ -44,11 +49,37 @@
 		this.boolValues= new2dByteArray(length, SEGMENT_LENGTH);
 	}
 	
-	public RLogicalByteFix64Store(final byte[][] values) {
+	public RLogicalByteFix64Store(final byte [] @NonNull[] values) {
 		this.length= check2dArrayLength(values, SEGMENT_LENGTH);
 		this.boolValues= values;
 	}
 	
+	public RLogicalByteFix64Store(final boolean [] @NonNull[] values,
+			final boolean @Nullable[] @NonNull[] isNAs) {
+		this.length= check2dArrayLength(values, SEGMENT_LENGTH);
+		this.boolValues= new2dByteArray(this.length, SEGMENT_LENGTH);
+		for (int i= 0; i < values.length; i++) {
+			final boolean[] sourceValues= values[i];
+			final byte[] destValues= this.boolValues[i];
+			for (int j= 0; j < sourceValues.length; j++) {
+				destValues[j]= (sourceValues[j]) ? TRUE_BYTE : FALSE_BYTE;
+			}
+		}
+		if (isNAs != null) {
+			if (check2dArrayLength(isNAs, SEGMENT_LENGTH) != this.length) {
+				throw new IllegalArgumentException();
+			}
+			for (int i= 0; i < isNAs.length; i++) {
+				final boolean[] isNAi= isNAs[i];
+				for (int j= 0; j < isNAi.length; j++) {
+					if (isNAi[j]) {
+						this.boolValues[i][j]= NA_logical_BYTE;
+					}
+				}
+			}
+		}
+	}
+	
 	
 	public RLogicalByteFix64Store(final RJIO io, final long length) throws IOException {
 		this.length= length;
@@ -77,6 +108,7 @@
 		return this.length;
 	}
 	
+	
 	@Override
 	public boolean isNA(final int idx) {
 		return (this.boolValues[idx / SEGMENT_LENGTH][idx % SEGMENT_LENGTH] == NA_logical_BYTE);
@@ -109,6 +141,7 @@
 				NA_logical_BYTE;
 	}
 	
+	
 	@Override
 	public boolean getLogi(final int idx) {
 		return (this.boolValues[idx / SEGMENT_LENGTH][idx % SEGMENT_LENGTH] == TRUE_BYTE);
@@ -133,7 +166,7 @@
 	
 	
 	@Override
-	public Boolean get(final int idx) {
+	public @Nullable Boolean get(final int idx) {
 		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
@@ -148,7 +181,7 @@
 	}
 	
 	@Override
-	public Boolean get(final long idx) {
+	public @Nullable Boolean get(final long idx) {
 		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
@@ -163,9 +196,9 @@
 	}
 	
 	@Override
-	public Boolean[] toArray() {
+	public @Nullable Boolean [] toArray() {
 		final int l= checkToArrayLength();
-		final Boolean[] array= new Boolean[l];
+		final var array= new @Nullable Boolean [l];
 		int k= 0;
 		for (int i= 0; i < this.boolValues.length; i++, k++) {
 			final byte[] bools= this.boolValues[i];
diff --git a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RLogicalInt32Store.java b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RLogicalInt32Store.java
index e80f917..d566ee4 100644
--- a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RLogicalInt32Store.java
+++ b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RLogicalInt32Store.java
@@ -16,6 +16,9 @@
 
 import java.io.IOException;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.rj.data.RJIO;
 
 
@@ -24,26 +27,27 @@
  * 
  * This implementation is limited to length of 2<sup>31</sup>-1.
  */
+@NonNullByDefault
 public class RLogicalInt32Store extends AbstractLogicalStore
 		implements RDataResizeExtension<Boolean>, ExternalizableRStore {
 	
 	
 	private int length;
 	
-	protected int[] boolValues;
+	protected int [] boolValues;
 	
 	
 	public RLogicalInt32Store() {
-		this.boolValues= EMPTY_INT_ARRAY;
 		this.length= 0;
+		this.boolValues= EMPTY_INT_ARRAY;
 	}
 	
-	public RLogicalInt32Store(final boolean[] values, final int[] naIdxs) {
-		this.boolValues= new int[values.length];
-		for (int i= values.length-1; i >= 0; i--) {
-			this.boolValues[i]= values[i] ? TRUE_INT : FALSE_INT;
+	public RLogicalInt32Store(final boolean [] values, final int @Nullable[] naIdxs) {
+		this.length= values.length;
+		this.boolValues= new int[this.length];
+		for (int i= values.length - 1; i >= 0; i--) {
+			this.boolValues[i]= (values[i]) ? TRUE_INT : FALSE_INT;
 		}
-		this.length= this.boolValues.length;
 		if (naIdxs != null) {
 			for (int i= 0; i < naIdxs.length; i++) {
 				this.boolValues[naIdxs[i]]= NA_logical_INT;
@@ -51,6 +55,24 @@
 		}
 	}
 	
+	public RLogicalInt32Store(final boolean [] values, final boolean @Nullable[] isNAs) {
+		this.length= values.length;
+		this.boolValues= new int[this.length];
+		for (int i= values.length - 1; i >= 0; i--) {
+			this.boolValues[i]= (values[i]) ? TRUE_INT : FALSE_INT;
+		}
+		if (isNAs != null) {
+			if (isNAs.length != this.length) {
+				throw new IllegalArgumentException();
+			}
+			for (int i= 0; i < isNAs.length; i++) {
+				if (isNAs[i]) {
+					this.boolValues[i]= NA_logical_INT;
+				}
+			}
+		}
+	}
+	
 	/**
 	 * Create new logical data based on the given Java int array
 	 * encoded as follows:
@@ -115,6 +137,7 @@
 		return this.length;
 	}
 	
+	
 	@Override
 	public boolean isNA(final int idx) {
 		return (this.boolValues[idx] == NA_logical_INT);
@@ -122,7 +145,7 @@
 	
 	@Override
 	public boolean isNA(final long idx) {
-		if (idx < 0 || idx >= length()) {
+		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
 		return (this.boolValues[(int) idx] == NA_logical_INT);
@@ -135,7 +158,7 @@
 	
 	@Override
 	public boolean isMissing(final long idx) {
-		if (idx < 0 || idx >= length()) {
+		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
 		return (this.boolValues[(int) idx] == NA_logical_INT);
@@ -148,12 +171,13 @@
 	
 	@Override
 	public void setNA(final long idx) {
-		if (idx < 0 || idx >= length()) {
+		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
 		this.boolValues[(int) idx]= NA_logical_INT;
 	}
 	
+	
 	@Override
 	public boolean getLogi(final int idx) {
 		return (this.boolValues[idx] != FALSE_INT);
@@ -161,7 +185,7 @@
 	
 	@Override
 	public boolean getLogi(final long idx) {
-		if (idx < 0 || idx >= length()) {
+		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
 		return (this.boolValues[(int) idx] != FALSE_INT);
@@ -169,15 +193,15 @@
 	
 	@Override
 	public void setLogi(final int idx, final boolean value) {
-		this.boolValues[idx]= value ? TRUE_INT : FALSE_INT;
+		this.boolValues[idx]= (value) ? TRUE_INT : FALSE_INT;
 	}
 	
 	@Override
 	public void setLogi(final long idx, final boolean value) {
-		if (idx < 0 || idx >= length()) {
+		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
-		this.boolValues[(int) idx]= value ? TRUE_INT : FALSE_INT;
+		this.boolValues[(int) idx]= (value) ? TRUE_INT : FALSE_INT;
 	}
 	
 	
@@ -188,7 +212,7 @@
 	
 	public void insertLogi(final int idx, final boolean value) {
 		prepareInsert(new int[] { idx });
-		this.boolValues[idx]= value ? TRUE_INT : FALSE_INT;
+		this.boolValues[idx]= (value) ? TRUE_INT : FALSE_INT;
 	}
 	
 	@Override
@@ -222,8 +246,8 @@
 	
 	
 	@Override
-	public Boolean get(final int idx) {
-		if (idx < 0 || idx >= length()) {
+	public @Nullable Boolean get(final int idx) {
+		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
 		return (this.boolValues[idx] != NA_logical_INT) ?
@@ -231,8 +255,8 @@
 	}
 	
 	@Override
-	public Boolean get(final long idx) {
-		if (idx < 0 || idx >= length()) {
+	public @Nullable Boolean get(final long idx) {
+		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
 		return (this.boolValues[(int) idx] != NA_logical_INT) ?
@@ -240,8 +264,8 @@
 	}
 	
 	@Override
-	public Boolean[] toArray() {
-		final Boolean[] array= new Boolean[length()];
+	public @Nullable Boolean [] toArray() {
+		final var array= new @Nullable Boolean [this.length];
 		for (int i= 0; i < array.length; i++) {
 			if (this.boolValues[i] != NA_logical_INT) {
 				array[i]= (this.boolValues[i] == TRUE_INT) ? Boolean.TRUE : Boolean.FALSE;
@@ -278,7 +302,7 @@
 		if (fromIdx < 0) {
 			fromIdx= 0;
 		}
-		final int l= length();
+		final int l= this.length;
 		final int[] ints= this.boolValues;
 		if (integer != 0) {
 			for (int i= (int) fromIdx; i < l; i++) {
diff --git a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RNumericB32Store.java b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RNumericB32Store.java
index 7e4c53c..180ac95 100644
--- a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RNumericB32Store.java
+++ b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RNumericB32Store.java
@@ -19,19 +19,23 @@
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.rj.data.RJIO;
 
 
 /**
  * This implementation is limited to length of 2<sup>31</sup>-1.
  */
+@NonNullByDefault
 public class RNumericB32Store extends AbstractNumericStore
 		implements RDataResizeExtension<Double>, ExternalizableRStore, Externalizable {
 	
 	
 	private int length;
 	
-	protected double[] realValues;
+	protected double [] realValues;
 	
 	
 	public RNumericB32Store() {
@@ -44,12 +48,12 @@
 		this.realValues= new double[length];
 	}
 	
-	public RNumericB32Store(final double[] values) {
+	public RNumericB32Store(final double [] values) {
 		this.length= values.length;
 		this.realValues= values;
 	}
 	
-	public RNumericB32Store(final double[] values, final int[] naIdxs) {
+	public RNumericB32Store(final double []  values, final int @Nullable[] naIdxs) {
 		this.length= values.length;
 		this.realValues= values;
 		if (naIdxs != null) {
@@ -59,6 +63,21 @@
 		}
 	}
 	
+	public RNumericB32Store(final double [] values, final boolean @Nullable[] isNAs) {
+		this.length= values.length;
+		this.realValues= values;
+		if (isNAs != null) {
+			if (isNAs.length != this.length) {
+				throw new IllegalArgumentException();
+			}
+			for (int i= 0; i < isNAs.length; i++) {
+				if (isNAs[i]) {
+					this.realValues[i]= NA_numeric_DOUBLE;
+				}
+			}
+		}
+	}
+	
 	
 	public RNumericB32Store(final RJIO io, final int length) throws IOException {
 		this.length= length;
@@ -103,6 +122,7 @@
 		return this.length;
 	}
 	
+	
 	@Override
 	public boolean isNA(final int idx) {
 		final double v= this.realValues[idx];
@@ -112,7 +132,7 @@
 	
 	@Override
 	public boolean isNA(final long idx) {
-		if (idx < 0 || idx >= length()) {
+		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
 		final double v= this.realValues[(int) idx];
@@ -127,7 +147,7 @@
 	
 	@Override
 	public void setNA(final long idx) {
-		if (idx < 0 || idx >= length()) {
+		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
 		this.realValues[(int) idx]= NA_numeric_DOUBLE;
@@ -142,7 +162,7 @@
 	
 	@Override
 	public boolean isNaN(final long idx) {
-		if (idx < 0 || idx >= length()) {
+		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
 		final double v= this.realValues[(int) idx];
@@ -157,12 +177,13 @@
 	
 	@Override
 	public boolean isMissing(final long idx) {
-		if (idx < 0 || idx >= length()) {
+		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
 		return (Double.isNaN(this.realValues[(int) idx]));
 	}
 	
+	
 	@Override
 	public double getNum(final int idx) {
 		return this.realValues[idx];
@@ -170,7 +191,7 @@
 	
 	@Override
 	public double getNum(final long idx) {
-		if (idx < 0 || idx >= length()) {
+		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
 		return this.realValues[(int) idx];
@@ -183,7 +204,7 @@
 	
 	@Override
 	public void setNum(final long idx, final double value) {
-		if (idx < 0 || idx >= length()) {
+		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
 		this.realValues[(int) idx]= (Double.isNaN(value)) ? NaN_numeric_DOUBLE : value;
@@ -254,8 +275,8 @@
 	
 	
 	@Override
-	public Double[] toArray() {
-		final Double[] array= new Double[length()];
+	public @Nullable Double [] toArray() {
+		final var array= new @Nullable Double [this.length];
 		final double[] reals= this.realValues;
 		for (int i= 0; i < array.length; i++) {
 			final double v= reals[i];
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 5bf89b7..b02410c 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
@@ -16,9 +16,14 @@
 
 import java.io.IOException;
 
+import org.eclipse.statet.jcommons.lang.NonNull;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.rj.data.RJIO;
 
 
+@NonNullByDefault
 public class RNumericBFix64Store extends AbstractNumericStore
 		implements ExternalizableRStore {
 	
@@ -28,7 +33,7 @@
 	
 	private final long length;
 	
-	protected final double[][] realValues;
+	protected final double [] @NonNull[] realValues;
 	
 	
 	public RNumericBFix64Store(final long length) {
@@ -36,11 +41,30 @@
 		this.realValues= new2dDoubleArray(length, SEGMENT_LENGTH);
 	}
 	
-	public RNumericBFix64Store(final double[][] values) {
+	public RNumericBFix64Store(final double [] @NonNull[] values) {
 		this.length= check2dArrayLength(values, SEGMENT_LENGTH);
 		this.realValues= values;
 	}
 	
+	public RNumericBFix64Store(final double [] @NonNull[] values,
+			final boolean @Nullable[] @NonNull[] isNAs) {
+		this.length= check2dArrayLength(values, SEGMENT_LENGTH);
+		this.realValues= values;
+		if (isNAs != null) {
+			if (check2dArrayLength(isNAs, SEGMENT_LENGTH) != this.length) {
+				throw new IllegalArgumentException();
+			}
+			for (int i= 0; i < isNAs.length; i++) {
+				final boolean[] isNAi= isNAs[i];
+				for (int j= 0; j < isNAi.length; j++) {
+					if (isNAi[j]) {
+						this.realValues[i][j]= NA_numeric_DOUBLE;
+					}
+				}
+			}
+		}
+	}
+	
 	
 	public RNumericBFix64Store(final RJIO io, final long length) throws IOException {
 		this.length= length;
@@ -69,6 +93,7 @@
 		return this.length;
 	}
 	
+	
 	@Override
 	public boolean isNA(final int idx) {
 		final double v= this.realValues[idx / SEGMENT_LENGTH][idx % SEGMENT_LENGTH];
@@ -121,6 +146,7 @@
 				this.realValues[(int) (idx / SEGMENT_LENGTH)][(int) (idx % SEGMENT_LENGTH)] ));
 	}
 	
+	
 	@Override
 	public double getNum(final int idx) {
 		return this.realValues[idx / SEGMENT_LENGTH][idx % SEGMENT_LENGTH];
@@ -145,7 +171,7 @@
 	
 	
 	@Override
-	public Double get(final int idx) {
+	public @Nullable Double get(final int idx) {
 		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
@@ -157,7 +183,7 @@
 	}
 	
 	@Override
-	public Double get(final long idx) {
+	public @Nullable Double get(final long idx) {
 		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
@@ -170,9 +196,9 @@
 	
 	
 	@Override
-	public Double[] toArray() {
+	public @Nullable Double [] toArray() {
 		final int l= checkToArrayLength();
-		final Double[] array= new Double[l];
+		final var array= new @Nullable Double [l];
 		int k= 0;
 		for (int i= 0; i < this.realValues.length; i++, k++) {
 			final double[] reals= this.realValues[i];
diff --git a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RRaw32Store.java b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RRaw32Store.java
index 295859d..46aa9cc 100644
--- a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RRaw32Store.java
+++ b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RRaw32Store.java
@@ -19,6 +19,9 @@
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
 
+import org.eclipse.statet.jcommons.lang.NonNull;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
 import org.eclipse.statet.rj.data.RJIO;
 import org.eclipse.statet.rj.data.RStore;
 
@@ -26,13 +29,14 @@
 /**
  * This implementation is limited to length of 2<sup>31</sup>-1.
  */
+@NonNullByDefault
 public class RRaw32Store extends AbstractRawStore
 		implements RDataResizeExtension<Byte>, ExternalizableRStore, Externalizable {
 	
 	
 	private int length;
 	
-	protected byte[] byteValues;
+	protected byte [] byteValues;
 	
 	
 	public RRaw32Store() {
@@ -45,7 +49,7 @@
 		this.length= length;
 	}
 	
-	public RRaw32Store(final byte[] values) {
+	public RRaw32Store(final byte [] values) {
 		this.byteValues= values;
 		this.length= this.byteValues.length;
 	}
@@ -90,6 +94,7 @@
 		return this.length;
 	}
 	
+	
 	@Override
 	public byte getRaw(final int idx) {
 		return this.byteValues[idx];
@@ -97,7 +102,7 @@
 	
 	@Override
 	public byte getRaw(final long idx) {
-		if (idx < 0 || idx >= length()) {
+		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
 		return this.byteValues[(int) idx];
@@ -110,7 +115,7 @@
 	
 	@Override
 	public void setRaw(final long idx, final byte value) {
-		if (idx < 0 || idx >= length()) {
+		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
 		this.byteValues[(int) idx]= value;
@@ -159,7 +164,7 @@
 	
 	@Override
 	public Byte get(final int idx) {
-		if (idx < 0 || idx >= length()) {
+		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
 		return Byte.valueOf(this.byteValues[idx]);
@@ -167,15 +172,15 @@
 	
 	@Override
 	public Byte get(final long idx) {
-		if (idx < 0 || idx >= length()) {
+		if (idx < 0 || idx >= this.length) {
 			throw new IndexOutOfBoundsException(Long.toString(idx));
 		}
 		return Byte.valueOf(this.byteValues[(int) idx]);
 	}
 	
 	@Override
-	public Byte[] toArray() {
-		final Byte[] array= new Byte[length()];
+	public @NonNull Byte [] toArray() {
+		final var array= new @NonNull Byte [this.length];
 		final byte[] raws= this.byteValues;
 		for (int i= 0; i < array.length; i++) {
 			array[i]= Byte.valueOf(raws[i]);
@@ -194,7 +199,7 @@
 			fromIdx= 0;
 		}
 		final byte raw= (byte) (integer & 0xff);
-		final int l= length();
+		final int l= this.length;
 		final byte[] raws= this.byteValues;
 		for (int i= (int) fromIdx; i < l; i++) {
 			if (raws[i] == raw) {
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 462d8cc..d27e597 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
@@ -16,10 +16,14 @@
 
 import java.io.IOException;
 
+import org.eclipse.statet.jcommons.lang.NonNull;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
 import org.eclipse.statet.rj.data.RJIO;
 import org.eclipse.statet.rj.data.RStore;
 
 
+@NonNullByDefault
 public class RRawFix64Store extends AbstractRawStore
 		implements ExternalizableRStore {
 	
@@ -29,7 +33,7 @@
 	
 	private final long length;
 	
-	protected final byte[][] byteValues;
+	protected final byte [] @NonNull[] byteValues;
 	
 	
 	public RRawFix64Store(final long length) {
@@ -37,7 +41,7 @@
 		this.byteValues= new2dByteArray(length, SEGMENT_LENGTH);
 	}
 	
-	public RRawFix64Store(final byte[][] values) {
+	public RRawFix64Store(final byte [] @NonNull[] values) {
 		this.length= check2dArrayLength(values, SEGMENT_LENGTH);
 		this.byteValues= values;
 	}
@@ -110,9 +114,9 @@
 	}
 	
 	@Override
-	public Byte[] toArray() {
+	public @NonNull Byte [] toArray() {
 		final int l= checkToArrayLength();
-		final Byte[] array= new Byte[l];
+		final var array= new @NonNull Byte [l];
 		int k= 0;
 		for (int i= 0; i < this.byteValues.length; i++, k++) {
 			final byte[] raws= this.byteValues[i];
diff --git a/core/pom.xml b/core/pom.xml
index 71591e6..a70c4bd 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -32,6 +32,7 @@
 	
 	<modules>
 		<module>org.eclipse.statet.rj.data</module>
+		<module>org.eclipse.statet.rj.data-tests</module>
 		<module>org.eclipse.statet.rj.server</module>
 		<module>org.eclipse.statet.rj.server.remotetools</module>
 		<module>org.eclipse.statet.rj.server.rpkg</module>